[PG] 조이스틱

[참고]

solution

  1. 각 알파벳마다 상하 조정 중 min값으로 최소 횟수를 담아두는 배열을 만든다.
  2. 0번 idx부터 시작해서 좌우 이동 횟수를 answer에 더해준다.
  3. 좌우 방향 전환 시에는 바꿔야 하는 알파벳이 나오기까지의 좌우 거리를 구한뒤, 그 중 최솟값이 되는 방향으로 전환한다.
  4. 모든 알파벳이 조정된 경우(change 배열이 전부 0인경우) 결과값을 반환한다.
def solution(name):
    change = [min(ord(i) - ord("A"), ord("Z") - ord(i)+1) for i in name]
    idx, answer = 0, 0

    while True:
        answer += change[idx]
        change[idx] = 0

        if sum(change) == 0:
            break

        left, right = 1, 1
        while change[idx - left] == 0:
            left += 1

        while change[idx + right] == 0:
            right += 1

        answer += left if left < right else right
        idx += -left if left < right else right
        
    return answer

크게 두 가지 방향에서 최솟값 고려
1. 상하 중 min
2. 좌우
A가 나올 때까지 next를 센다.
3. 마지막이 A로 끝날 경우

def solution(name):
    answer = 0
    min_move = len(name) - 1
    next = 0
    
    while name[min_move] == 'A' and min_move > 0:
        min_move -= 1
    
    if (min_move < 0):
        return answer
        
    for i, char in enumerate(name):
        answer += min(ord(char) - ord('A'), ord('Z') - ord(char) + 1)
        
        next = i + 1
        while next < len(name) and name[next] == 'A':
            next += 1
        
        min_move = min(min_move, i + (i + len(name)) - next)
    answer += min_move
    return answer

좋은 웹페이지 즐겨찾기