사실 처음부터 혼자 알고리즘을 생각해내지는 못했다. 그래서 다른 사람들의 코드를 보고 풀이 방식을 이해했다.
대체 중간에 2, 5, 8, 0을 누를 때 어떤 방식으로 최단거리를 구해야하는지 이해가 안됐는데, 다른 코드를 보고나니 충분히 생각해낼 수 있었던 문제였다.
1, 4, 7 / 3, 6, 9인 경우는 간단하기 때문에 목표 지점이 2, 5, 8, 0일 때만 고민하면 됐다.
📍
일단 시작지점이 왼손은 *, 오른손은 #이라서 각각 10, 12라고 지정했고, 0은 11이라고 했다.
if(n==0) n += 11;
📍
목표 지점이 2, 5, 8, 0일 때 현재 위치와 목표 숫자까지의 거리를 구해야 한다.
목표 숫자에서 현재 손가락이 위치한 숫자를 뺀 값에 3을 나눈 몫이 가로길이, 3으로 나눈 나머지 값이 세로길이이다.
leftLth = Math.abs(n-left)/3 + Math.abs(n-left)%3;
rightLth = Math.abs(n-right)/3 + Math.abs(n-right)%3;
class Soultion{
public String solution(int[] numbers, String hand) {
StringBuilder sb = new StringBuilder();
int left = 10, right = 12;
int leftLth, rightLth;
for(int n : numbers){
if (n == 1 || n == 4 || n == 7){
sb.append("L");
left = n;
}
else if (n == 3 || n == 6 || n == 9){
sb.append("R");
right = n;
}
else if ( n == 2 || n == 5 || n == 8 || n == 0){
if(n==0) n += 11;
leftLth = Math.abs(n-left)/3 + Math.abs(n-left)%3;
rightLth = Math.abs(n-right)/3 + Math.abs(n-right)%3;
if(leftLth == rightLth){
if(hand.equals("left")) {
sb.append("L");
left = n;
}
else {
sb.append("R");
right = n;
}
}
else if (leftLth < rightLth){
sb.append("L");
left = n;
}
else{
sb.append("R");
right = n;
}
}
}
return sb.toString();
}
}