Algorithm/Programmers

조이스틱 : Java

say! 2025. 7. 5. 06:55
728x90
  1. 각 알파벳을 만들기 위한 상하 조작 최소 횟수 구하기
    • A → B → ... → Z: 위로 i번 (총 26자)
    • A → Z는 아래로 1번이 더 빠름
    • Math.min(char - 'A', 'Z' - char + 1)
  2. 좌우 이동 최솟값 찾기
    • 왼쪽/오른쪽으로 이동하며 커서를 움직여야 함
    • 중간에 "A"가 연속될 경우 건너뛰는 전략이 필요
    • 기본은 오른쪽으로 name.length() - 1번 이동
    • A가 연속될 경우 뒤로 갔다가 다시 가는 방식이 더 짧을 수 있음
    • Greedy하게 모든 지점에서 연속된 A를 고려하며 최단 이동 계산
class Solution {
    public int solution(String name) {
        int answer = 0;
        int length = name.length();

        // 1. 상하 조작 횟수
        for (int i = 0; i < length; i++) {
            char c = name.charAt(i);
            answer += Math.min(c - 'A', 'Z' - c + 1);
        }

        // 2. 좌우 이동 최소화
        int minMove = length - 1;  // 기본: 한쪽으로 끝까지 가기

        for (int i = 0; i < length; i++) {
            int next = i + 1;

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

            // 좌→우→뒤로 돌아가는 경로, 또는 우→좌→앞으로 가는 경로 중 최소
            minMove = Math.min(minMove, i + length - next + Math.min(i, length - next));
        }

        answer += minMove;
        return answer;
    }
}

'Algorithm > Programmers' 카테고리의 다른 글

기능개발 : Java  (0) 2025.07.05
완주하지 못한 사람 : Java  (0) 2025.07.05
[Lv.2] 소수찾기 : Java  (0) 2025.07.05
[Lv.2] 피로도 : Java / DFS+백트래킹  (0) 2025.07.05
[Lv.3] 이중우선순위큐  (0) 2025.07.04