조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA
조이스틱을 각 방향으로 움직이면 아래와 같습니다.▲ - 다음 알파벳
▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동
예를 들어 아래의 방법으로 "JAZ"를 만들 수 있습니다.
- 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다.
- 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다.
- 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다.
따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.
만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.
name은 알파벳 대문자로만 이루어져 있습니다.
name의 길이는 1 이상 20 이하입니다.
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);
}
}
가독성 개똥이다. 다른 사람들의 코드를 참고로 다시 한번 내 방식대로 풀었다. 1차 시도한 위 코드를 남기고 나중에 재풀이 할 때 오답노트로 사용해야지