Algorithm

프로그래머스: 조이스틱

10Biliion 2025. 4. 21. 15:36

문제

이름을 만들기 위해 조이스틱을 조작하는 최소 횟수를 구하는 문제입니다.

  • 조이스틱은 ▲(위), ▼(아래), ◀(왼쪽), ▶(오른쪽)으로 움직입니다.
  • ▲: A부터 Z로, ▼: Z부터 A로 변경
  • 목표 문자열은 알파벳 대문자로 이루어져 있고, 처음에는 모든 문자가 A로 되어 있음
  • 커서를 좌우로 이동하며 알파벳을 변경해 원하는 이름을 만들어야 함

핵심

  1. 위/아래 조작 (▲▼)
    • 각 문자마다 A에서 목표 문자로 바꾸기 위해 최소 몇 번 이동해야 하는지를 계산
    • Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1) 를 사용해서 위로 가는 경우와 아래로 가는 경우 중 더 작은 값 사용
  2. 좌/우 조작 (◀▶)
    • 단순히 오른쪽으로만 이동하면 length - 1번이 필요하지만,
    • 중간에 A가 연속되는 구간은 굳이 방문하지 않아도 되므로 최적의 경로를 계산해야 함

코드구현

class Solution {
    public int solution(String name) {
        int answer = 0;
        int length = name.length();

        // ▲▼ 최소 횟수 계산
        for (int i = 0; i < length; i++) {
            answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1);
        }

        // ◀▶ 이동 최소값 계산
        int move = length - 1; // 그냥 오른쪽으로만 가는 경우
        for (int i = 0; i < length; i++) {
            int next = i + 1;

            // A가 연속되는 구간 찾기
            while (next < length && name.charAt(next) == 'A') {
                next++;
            }

            // 1. 오른쪽 → i → 왼쪽 → 끝까지
            move = Math.min(move, i * 2 + length - next);

            // 2. 왼쪽 → 끝까지 → 오른쪽 → i
            move = Math.min(move, (length - next) * 2 + i);
        }

        return answer + move;
    }
}