코딩문제풀이/프로그래머스

[Python] 조이스틱

코딩하는 포메라니안 2021. 8. 28. 01:46

1. 문제

 

 

 

2. 풀이 과정

이 문제에서 답이 될 수 있는 후보는 두 가지이다.

 

1. 첫 번째는 단순히 index 0번에서 끝까지 차례대로 가면서 알파벳을 맞춰주는 것이다.

2. 두 번째는 제일 긴 A들의 연속을 피해서 둘러가는 것이다. A가 있는 건 굳이 갈 필요가 없는 곳이다.

 

제일 긴 A들의 연속만 피하고 짧은 A연속은 무시하는 이유는 예를 들어 설명하겠다.

"KFPWAAAOFAAAAAALFJ"이라는 문자열이 입력으로 들어왔다고 할 때, 굵은 글자는 무조건 가야 하는 곳이다.

OF로 가기 위해서는 짧은 A의 연속을 지나가는 것이 더 빠른 길이다.

정리하자면, A를 피해가는 방법 중에서는 제일 긴 A들의 연속을 피해 가는 것이 제일 빠른 방법이 된다.

 

또 여기서 "KFPWAAAOFAAAAAALFJ" 형광펜 칠한 부분을 지나가야되는데 가장 빠른 방법을 생각해보자. idex = 0번부터 시작해서 배열의 끝부분인 J => F => L을 바꿔준 후, 다시 idex = 0으로 돌아가서 F까지 가는 것이 가장 빠르다.

시작점(idx= 0)을 기준으로 앞, 뒤중 짧은 곳을 두 번 반복하고 긴 곳을 한 번 가면 되는 것이다.

 

def cursor(s, e):#e전까지
    if s == e:
        return 0
    else:
        return e-s-1
        
def solution(name):
    answer = 0
    start = -1
    end = -1
    max_v = [0, start, end]
    for i in range(len(name)):
    	#A의 길이가 최대인 시작, 끝 idx를 저장
        if name[i] == 'A'and start == -1:
            start = i
        elif name[i] != 'A' and start != -1:
            end = i
            if max_v[0] < end - start + 1:
                max_v = [end-start+1, start, end]
            start = -1
        #알파벳 바꿀 때 count
        answer += min(ord(name[i])-ord('A'), ord('Z')-ord(name[i])+1)
    
    if max_v[0] > 0:
    	#>>>시작점부터 A들의 시작 전까지
        p = cursor(0, max_v[1])
        #<<<A들의 끝 idx부터 배열 끝을 지나 시작점(+1)
        r = cursor(max_v[2], len(name)+1)
        #A 무시하고 직진 vs A 피해서 짧은 거리를 반복하고 긴 거리를 한 번만 가도록
        answer += min(len(name)-1, min(p, r)+p+r)
    else: #A가 없으면 직진이 빠른 길
        answer += len(name)-1
        
    return answer

'코딩문제풀이 > 프로그래머스' 카테고리의 다른 글

[Python] 구명보트  (0) 2021.08.28
[Python] 큰 수 만들기  (0) 2021.08.28
[Python] 소수 찾기  (0) 2021.08.27
[Python] H-Index  (0) 2021.08.27
[Python] 가장 큰 수  (0) 2021.08.26