99클럽 코테 스터디 10일차 TIL [프로그래머스] 조이스틱 (Java)

민경·2024년 6월 4일

문제

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

풀이

각 문자에 대해 알파벳을 변경하는 횟수와 커서를 이동하는 횟수를 고려해야 하는 문제

  • 최소 알파벳 변경 횟수는 A와의 차이와 Z와의 차이 중 최솟값이다.
  • 커서 이동 횟수는 최악의 경우(name의 길이 - 1)와 비교해 최솟값을 선택한다.

틀린 코드

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

        for (int i = 0; i < length; i++) {
            answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1);
            int next = i + 1;
            while (next < length && name.charAt(next) == 'A') {
                next++;
            }
            move = Math.min(move, i + length - next + i);
        }

        answer += move;
        return answer;
    }
}

틀린 이유

move를 계산하는 방식에서 모든 케이스를 고려하지 못 함

  • 왼쪽으로 돌아가는 경우
  • 오른쪽으로 쭉 가는 경우
  • 왼쪽으로 갔다가 다시 오른쪽으로 가는 경우
  • 오른쪽으로 갔다가 다시 왼쪽으로 가는 경우

정답 코드

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;
            while (next < length && name.charAt(next) == 'A') {
                next++;
            }
            move = Math.min(move, i + length - next + Math.min(i, length - next));
        }

        answer += move;
        return answer;
    }
}
profile
강해져야지

0개의 댓글