-
[Algorithm - 프로그래머스] Python 조이스틱Programming/Algorithm 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'가 아닌)를 만나게 되면 탐색을 그만한다.
구현은 어렵지 않지만 사고하는 방법이 꽤 까다로운 문제였다.
이런 문제는 계속 풀어봐야 늘 것 같다..!
'Programming > Algorithm' 카테고리의 다른 글
[Algorithm - 프로그래머스] Python 전력망을 둘로 나누기 (0) 2021.11.23 [Algorithm - 프로그래머스] Python 숫자 문자열과 영단어 (0) 2021.10.21 [Algorithm - 프로그래머스] Python 신규 아이디 추천 (0) 2021.10.20 [Algorithm - 프로그래머스] Python 로또의 최고 순위와 최저 순위 (0) 2021.10.19 [Algorithm] Python 1부터 n까지의 합 (0) 2021.09.23