[프로그래머스 42860] 조이스틱

이신우·2021년 6월 28일
1
post-thumbnail

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

문제 접근

최종 목표 : 조이스틱 조작 횟수의 최솟값 출력

사실 이 문제가 그리디인지 완전탐색 문제인지 잘 모르겠다...😅
내 생각에는 모든 노드를 탐색하여 조작 횟수의 최솟값을 찾는 문제라 완전탐색으로 접근해야 맞는 것 같다.

우선 문제를 쪼개어서 생각해 보자🧐

문제 쪼개기

  1. 상하 이동 최소 횟수 구하기
  2. 좌우 이동 최소 횟수 구하기
  3. 이동 횟수를 모두 더하여 결과 출력

상하 이동 횟수: 현재 문자가 A에 더 가까운지 Z에 더 가까운지 계산
좌우 이동 횟수: 현재 노드에서 좌측과 우측의 이동횟수를 비교하여 더 적은 것을 선택

문제 해결 아이디어

  • 상하 이동 최소 횟수: 아스키 코드를 이용하여 계산
    min(charA,Zchar+1)min(char - 'A', 'Z'- char + 1)
  • 좌우 이동 최소 횟수: 좌측과 우측을 비교하여 더 적은 곳으로 계산
    min(left,right)min(left, right)

코드

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
        

0개의 댓글