Programming/Algorithm

[Algorithm - 프로그래머스] Python 조이스틱

100winone 2021. 11. 21. 16:29

문제 (LV.2)

https://programmers.co.kr/learn/courses/30/lessons/42860

 

코드

def solution(name):
    answer = 0
    # 문자를 배열 숫자로 변경 -> ascii로 변경하여 최소 순서
    arr_name = [min(ord(i) - ord('A'), ord('Z') - ord(i) + 1) for i in name]
    idx = 0
    while True:
        answer += arr_name[idx]
        arr_name[idx] = 0
        if sum(arr_name) == 0:
            break

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

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

 

 

해설

LV2 그리디였지만 생각보다 접근방법이 까다로웠던 문제였다.

arr_name = [min(ord(i) - ord('A'), ord('Z') - ord(i) + 1) for i in name]

특정 방법이 생각나지 않아 구글링 해보니, 위 방법을 사용하여 문제를 해결하신 분들이 많았다.

조이스틱을 위로 움직일지 아래로 움직일지를 결정하는 최소 횟수를 구하여 배열에 저장하는 코드이다.

 

상하좌우의 최솟값을 구하는 경우에서 상하는 위 코드로 구현하였고,

좌우로 움직이는 방법의 최솟값은 left, right를 양쪽으로 움직여 0이 아닌 숫자(즉 'A'가 아닌)를 만나게 되면 탐색을 그만한다.

 

구현은 어렵지 않지만 사고하는 방법이 꽤 까다로운 문제였다.

이런 문제는 계속 풀어봐야 늘 것 같다..!