Published:
Updated:

  • min_move를 구하는 로직을 이해하는 데 시간이 많이 걸렸다.
    • 이건 꼭 다시 풀어봐야 할 것 같다.
    • 이 문제를 이해하는 데 며칠이 걸렸는지 모르겠다.


Solution

def solution(name: str):
    # 상하 이동
    up_down = 0
    name_length = len(name)
    # 좌우 이동 (한쪽 방향으로 계속 움직였을 경우을 저장, 즉 최댓값을 저장해 둠)
    left_right = name_length - 1

    for i, c in enumerate(name):
        # 상하 이동 최솟값 저장 (알파벳 이동)
        up_down += min(ord(c) - ord('A'), ord('Z') - ord(c) + 1)

        # 다음 index부터의 연속된 A 문자열 찾기 (몇 개인지)
        next_i = i + 1
        while next_i < name_length and name[next_i] == 'A':
            next_i += 1

        # 좌우 이동 최솟값 저장 (커서 이동)
        # ->
        # 이전 이동 값
        # 연속된 A 문자열의 왼쪽 시작
        # 연속된 A 문자열의 오른쪽 시작
        left_right = min([
            # (name_length - next_i): 현재 위치 다음부터 나오는 연속된 A 문자열의 길이
            left_right,
            # i * 2는 현재 내 위치까지 왔다가 (i), 다시 처음 위치로 돌아가는 (i * 2) 의미
            # 오른쪽으로 갔다가 다시 왼쪽으로 꺾기
            (i * 2) + (name_length - next_i),
            # 왼쪽으로 갔다가 다시 오른쪽으로 꺾기
            # i는 현재 위치로 간다는 의미고
            # (name_length - next_i) * 2는 A 문자열을 뛰어넘은 후 다시 문자열 끝에 도달하는 데 필요
            i + (name_length - next_i) * 2
        ])

    # 상하 + 좌우
    return up_down + left_right


print(solution('JEROEN'))
print(solution('JAN'))


Reference

Leave a comment