def solution(name):
    minimum_move = [min(ord(i) - ord('A'), ord('Z') - ord(i) + 1) for i in name]
    i, answer = 0, 0
    while True:
        answer += minimum_move[i]
        minimum_move[i] = 0
        if sum(minimum_move) == 0:
            break
        l, r = 1, 1
        while minimum_move[i - l] == 0:
            l += 1
        while minimum_move[i + r] == 0:
            r += 1
        answer += l if l < r else r
        i += -l if l < r else r
    return answer

print(solution(input()))

 

일단 아스키코드 ord함수를 이용해 A부터 Z까지 해당 문자를 오름차순/내림차순 중 빠른 루트를 선택한다.

모든 문자들의 필요 횟수를 리스트에 담아둔 후 이동할 때 마다 해당 루트 수를 0으로 만든다(잔여이동횟수 느낌)

 

문제는  무조건 0에서 끝 까지 가는게아니라 가다가 중간에 되돌아 가는게 더 빠를 경우도 있다는 것이다.

이를 위해 left와 right를 각각 구하여 먼저 도달하는 수를 정답에 더해주면 된다.

+ Recent posts