본문 바로가기

Programming/코딩테스트 준비

[프로그래머스] 조이스틱 (Java)

728x90

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

 

코딩테스트 연습 - 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다

programmers.co.kr

 

풀이 및 코드

class Solution {
    public int solution(String name) {
        int answer = 0;
        int length = name.length();
        int min_move = length - 1;  // 커서를 최소로 움직인 횟수
        for(int i = 0; i < length; i++){
            // i번째 글자에 대해
            char c = name.charAt(i) ;
            // ▲와 ▼ 중 조작 횟수가 적은 것으로 선택
            answer += Math.min(c - 'A', 'Z' - c + 1);

            // 다음 글자부터 A가 연속으로 나올때
            // 어느 방향으로 커서를 이동하는 것이 횟수가 적을지 체크하기 위해
            // A가 연속으로 나오다 끝나는 지점 찾기 (next_index)
            int next_index = i + 1;
            while(next_index < length && name.charAt(next_index) == 'A')
                next_index++;
            
            // 첫글자에서 끝까지 커서를 오른쪽으로만 이동하는 것과
            // i번까지 오른쪽으로 이동하고 왼쪽으로 이동하여 next_index까지 이동하는 것중
            // 조작 횟수가 적은 것을 선택
            // ex) TTAAAAYYY (i=1인 상황, next_index = 6) -> min(8, 2 * 1 + (9 - 6)) = min(8,5) = 5
            min_move = Math.min(min_move, 2 * i + (length - next_index));
        }
        // 최소 커서 이동 횟수 추가
        answer += min_move;
        
        return answer;
    }
}