https://programmers.co.kr/learn/courses/30/lessons/42860
최종 목표 : 조이스틱 조작 횟수의 최솟값 출력
사실 이 문제가 그리디인지 완전탐색 문제인지 잘 모르겠다...😅
내 생각에는 모든 노드를 탐색하여 조작 횟수의 최솟값을 찾는 문제라 완전탐색으로 접근해야 맞는 것 같다.
우선 문제를 쪼개어서 생각해 보자🧐
- 상하 이동 최소 횟수 구하기
- 좌우 이동 최소 횟수 구하기
- 이동 횟수를 모두 더하여 결과 출력
상하 이동 횟수: 현재 문자가 A에 더 가까운지 Z에 더 가까운지 계산
좌우 이동 횟수: 현재 노드에서 좌측과 우측의 이동횟수를 비교하여 더 적은 것을 선택
- 상하 이동 최소 횟수: 아스키 코드를 이용하여 계산
- 좌우 이동 최소 횟수: 좌측과 우측을 비교하여 더 적은 곳으로 계산
def solution(name):
# 아스키 코드를 이용하여 상하 이동 최소 횟수를 구함
graph = [min(abs(ord(char) - ord('A')), abs(ord('Z') - ord(char)+1)) for char in name]
now, answer = 0, 0
while True:
# 현재 방문노드 처리
answer += graph[now]
graph[now] = 0
# 모든 노드를 방문하였을때 종료
if sum(graph) == 0:
break
# 좌측과 우측을 비교하며 더 짧은 곳으로 이동
left, right = 1, 1
# 좌측 체크: 좌측 문자열을 변경할 필요가 없는 경우 좌측으로 이동
while graph[now - left] == 0:
left += 1
# 우측 체크: 우측 문자열을 변경할 필요가 없는 경우 우측으로 이동
while graph[now + right] == 0:
right += 1
# 더 작은 값으로 업데이트 후
# 이동 거리가 더 짧은 곳으로 인덱스를 이동
answer += min(left, right)
now += -left if left < right else right
return answer