LV2. 조이스틱
September 03, 2019
문제 설명 및 제한 조건
내 풀이
class Solution {
public int solution(String name) {
int answer = 0;
int[] arr = nameToArray(name);
int start = startIndex(arr);
int end = endIndex(arr);
int beforeZero = beforeZero(arr, start, end);
int afterZero = afterZero(arr, start, end);
int way = shorterWay(arr, start, end, beforeZero, afterZero);
for(int i=0; i<arr.length; i++) {
answer += arr[i];
}
answer += way;
return answer;
}
private int[] nameToArray(String name) {
int[] arr = new int[name.length()];
for(int i=0; i<name.length(); i++) {
arr[i] = name.charAt(i) - 'A';
if(arr[i] > 13) {
arr[i] = arr[i] - (2 * (arr[i] - 13));
}
}
return arr;
}
private int startIndex(int[] arr) {
for(int i=0; i<arr.length; i++) {
if(arr[i] > 0) return i;
}
return 0;
}
private int endIndex(int[] arr) {
for(int i=arr.length-1; i>0; i--) {
if(arr[i] > 0) return i;
}
return arr.length-1;
}
private int beforeZero(int[] arr, int start, int end) {
for(int i=start; i<end; i++) {
if(arr[i] == 0) {
return i-1;
}
}
return -1;
}
private int afterZero(int[] arr, int start, int end) {
for(int i=start; i<=end; i++) {
if(arr[i] == 0) {
for(int j=i; j<=end; j++) {
if(arr[j] != 0) {
return j+1;
}
}
}
}
return -1;
}
private int shorterWay(int[] arr, int start, int end, int beforeZero, int afterZero) {
if(beforeZero == -1 || afterZero == -1) {
return end;
}else {
return Math.min(end, (2*beforeZero+arr.length-afterZero)+1);
}
}
}
- 알파벳을 최소 이동거리로 치환하는 로직
- 오른쪽으로 계속 이동하면서 가는게 최소이동거리인지 오른쪽으로 갔다가 다시 왼쪽으로 백해서 가는게 최소이동 거리인지 판단해야함
- 테스트케이스 11 에서 한참 막혀서 확인해보니 “AAABAAA” 가 4 인경우를 생각 안했음. 필요한 변수가 총 4개 였음… 더 줄일 수 있을 것 같은데…