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

유존돌돌이·2021년 9월 9일
0

Programmers

목록 보기
5/167
post-thumbnail

문제 설명

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

▲ - 다음 알파벳
▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동
예를 들어 아래의 방법으로 "JAZ"를 만들 수 있습니다.

  • 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다.
  • 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다.
  • 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다.
    따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.
    만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.

제한 사항

name은 알파벳 대문자로만 이루어져 있습니다.
name의 길이는 1 이상 20 이하입니다.

My Code

class Solution {
    private int seriesRight = 0;
    private int seriesLeft = 0;
    private int[] series;
    public int solution(String name) {
        // [length, start Index]
        series = new int[]{0,0};
        int[] tmp = new int[]{0,0};
        for(int i=0 ; i<name.length() ; i++) {
            char c = name.charAt(i);
            if(c=='A') {
                if(tmp[0]==0) tmp[1] = i;
                tmp[0]++;
            } else {
                if(series[0]<tmp[0]) {
                    series[0] = tmp[0];
                    series[1] = tmp[1];
                }
                tmp[0] = 0;
            }
        }
        int right = getSteps(name,0,0,0,true);
        int left = getSteps(name,0,0,0,false);
        int seriesLen = Integer.MAX_VALUE;
        if(series[0]>0) {
            seriesLen = seriesRight + seriesLeft + Math.min(series[1]-1, name.length() - (series[0]+series[1]));
        }
        return Math.min(seriesLen, Math.min(right, left));
    }
    public int getSteps(String name, int idx, int step, int cnt, boolean right) {
        if(idx>=name.length() || (idx==0 && step>0)) {
            return cnt;
        }
        int n = name.charAt(idx)-'A';
        n = Math.min(n, 26-n);
        if(n>0) {
            cnt += (step+n);
            step = 0;
        }
        if(right && series[0]>0 && idx==series[1]-1) {
            seriesRight = cnt;
        }
        if(!right && series[0]>0 && idx==series[1]+series[0]) {
            seriesLeft = cnt;
        }
        return getSteps(name, right?idx+1:(idx==0?name.length()-1:idx-1), step+1, cnt, right);
    }
}

Comment

가독성 개똥이다. 다른 사람들의 코드를 참고로 다시 한번 내 방식대로 풀었다. 1차 시도한 위 코드를 남기고 나중에 재풀이 할 때 오답노트로 사용해야지

0개의 댓글