본문 바로가기
Coding Test/Programmers

[프로그래머스] 조이스틱 [JAVA(자바)]

‘프로그래머스 코딩테스트 고득점 Kit’ 문제 입니다. 😀

문제 👉 <코딩테스트 연습 - 조이스틱 | 프로그래머스>

1. 문제

모든 글자가 A로 구성된 문자를 조이스틱을 최소한의 조작 횟수로 원하는 문자를 만들어야 한다.

조이스틱을 각 방향으로 움직이면 아래와 같다.

▲ - 다음 알파벳

▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)

◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)

▶ - 커서를 오른쪽으로 이동

2. 풀이

Greedy 를 이용한 문제 풀이

  1. 알파벳 변경을 위해 A->B->C 방향과 A->Z->Y 방향 중 가까운 것으로 한다.

  2. 커서 이동을 할 경우 연속된 A가 나오면 이동할 커서의 값이 줄어든다.

    1. 커서를 오른쪽으로 순서대로 이동하는 경우 (array.length - 1)
      1. Ex) ABCAAAAAADC : A->B->C->A->...->A->D->C = 10칸
    2. 현재 위치에서 다음 값이 A의 연속일 경우 다시 맨 왼쪽으로 이동 후 연속된 A가 끝나는 지점의 다음으로 이동
      1. Ex) ABCAAAAAADC : A->B->C->B->A->C->D = 6칸
      2. 현재 위치(C)에서 맨 왼쪽으로 이동 : 2+2
      3. 연속된 A가 끝나는 지점의 다음(D)으로 이동 : 2

3. 코드

class Solution {
    public int solution(String name) {
        int answer = 0;
        int len = name.length();
        int min_move = len-1;   // 커서를 오른쪽으로 순서대로 이동할 경우

        for (int i=0; i<len; i++) {
            // 알파벳 변경
            answer += Math.min(name.charAt(i)-'A', 'Z'-name.charAt(i)+1);

            // A가 아닌 다음 값 찾기
            int next = i+1;
            while (next < len && name.charAt(next) == 'A') {
                next++;
            }
            min_move = Math.min(min_move, i+i + len-next);
        }

        return answer + min_move;
    }
}


References


🏋🏻 개인적으로 공부한 내용을 기록하고 있습니다.
잘못된 부분이 있다면 과감하게 지적해주세요!! 🏋

댓글