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'가 아닌)를 만나게 되면 탐색을 그만한다.
구현은 어렵지 않지만 사고하는 방법이 꽤 까다로운 문제였다.
이런 문제는 계속 풀어봐야 늘 것 같다..!