- get_distance로 현재 알파벳에서 얼마나 돌려야 목표 알파벳이 나오는지 최소 이동거리 구해 준다.
- get_next로 왼쪽/오른쪽 얼마나 이동해야하는지 구하는데.. 그리디를 사용해야 된다고 해서 0이 아닌 수까지의 거리가 짧은 방향으로 이동하게끔 구현을 하였음. 하지만 왼쪽-오른쪽 위치가 같은 경우를 따로 처리하지 않았음에도 정답이 나와서 이상함..
- 여튼, 매 순간 최소 이동거리와 돌려야 하는 횟수를 더해주면 된다.
def get_distance(c):
p1 = abs(ord(c) - ord('A')) # 정방향
p2 = abs(ord('Z') - ord(c) + 1) # 역방향
return min(p1, p2)
def get_next(arr, idx):
p = idx
right_move = 0
while True:
p = (p + 1) % len(arr)
right_move += 1
if arr[p] != 0:
break
t = idx
left_move = 0
while True:
t = (t - 1) % len(arr)
left_move += 1
if arr[t] != 0:
break
if right_move <= left_move:
return (p, right_move)
else:
return (t, left_move)
def solution(name):
answer = 0
distance = [0] * len(name)
for i, p in enumerate(name):
distance[i] = get_distance(p)
answer = distance[0]
distance[0] = 0
idx = 0
while sum(distance) != 0:
idx, movement = get_next(distance, idx)
answer += movement
answer += distance[idx]
distance[idx] = 0
return answer
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
'알고리즘[Python] > 프로그래머스' 카테고리의 다른 글
[ Lv 2 ] 배달 (0) | 2021.06.25 |
---|---|
[ Lv 2 ] H-Index (0) | 2021.06.24 |
[ Lv 2 ] 예상 대진표 (0) | 2021.06.24 |
[ Lv 2 ] 전화번호 목록 (0) | 2021.06.23 |
[ Lv 2 ] 프린터 (0) | 2021.06.23 |