이 문제도 크게 어려움 없이 풀었다.
다만 거리계산을 할 때, 나는 피타고라스를 썼지만
이 문제는 맨해튼 거리 계산법을 사용했기에 그 부분을 살짝 헤맸지만
그걸 제외하고는 크게 어려운 부분은 없는 것 같다.
초기 설정 : 왼손과 오른손의 초기 위치는 각각 * 과 # 이다. 이를 좌표로 표현하면 [3, 0] , [3, 2] 이다.
left = new int[]{3, 0};
right = new int[]{3, 2};
입력 숫자 처리 : 주어진 숫자 배열 numbers를 순회하며 입력된 숫자에 따른 처리를 한다. 숫자 위치는 키패드를 2차원
배열 형태로 생각하면 될 것이고 [행, 열]로 표현된다.
for(int i = 0; i < numbers.length; i++) {
int number = numbers[i];
useHand(number, hand);
}
손가락 사용 결정 :
- 숫자 1, 4, 7은 항상 왼손으로 입력한다.
- 숫자 3, 6, 9는 항상 오른손으로 입력한다.
- 숫자 2, 5, 8, 0은 더 가까운 손으로 입력하고, 두 손과의 거리가 같을 때에는 hand로 주어진 손을 사용해 입력한다.
public static void useHand(int number, String hand) {
switch (number) {
case 1 :
sb.append("L");
left[0] = 0; left[1] = 0;
break;
case 2 :
int[] two = {0, 1};
if(calculator(two, left) < calculator(two, right)) {
sb.append("L");
left = two;
break;
} else if(calculator(two, left) > calculator(two, right)) {
sb.append("R");
right = two;
break;
} else {
if("right".equals(hand)) {
sb.append("R");
right = two;
break;
} else {
sb.append("L");
left = two;
break;
}
}
case 3 :
sb.append("R");
right[0] = 0; right[1] = 2;
break;
case 4 :
sb.append("L");
left[0] = 1; left[1] = 0;
break;
case 5 :
int[] five = {1, 1};
if(calculator(five, left) < calculator(five, right)) {
sb.append("L");
left = five;
break;
} else if(calculator(five, left) > calculator(five, right)) {
sb.append("R");
right = five;
break;
} else {
if("right".equals(hand)) {
sb.append("R");
right = five;
break;
} else {
sb.append("L");
left = five;
break;
}
}
case 6 :
sb.append("R");
right[0] = 1; right[1] = 2;
break;
case 7 :
sb.append("L");
left[0] = 2; left[1] = 0;
break;
case 8 :
int[] eight = {2, 1};
if(calculator(eight, left) < calculator(eight, right)) {
sb.append("L");
left = eight;
break;
} else if(calculator(eight, left) > calculator(eight, right)) {
sb.append("R");
right = eight;
break;
} else {
if("right".equals(hand)) {
sb.append("R");
right = eight;
break;
} else {
sb.append("L");
left = eight;
break;
}
}
case 9 :
sb.append("R");
right[0] = 2; right[1] = 2;
break;
case 0 :
int[] zero = {3, 1};
if(calculator(zero, left) < calculator(zero, right)) {
sb.append("L");
left = zero;
break;
} else if(calculator(zero, left) > calculator(zero, right)) {
sb.append("R");
right = zero;
break;
} else {
if("right".equals(hand)) {
sb.append("R");
right = zero;
break;
} else {
sb.append("L");
left = zero;
break;
}
}
}
}
거리 계산 로직 : 주어진 숫자와 현재의 손가락 위치와의 거리를 계산한다.
public static int calculator(int[] number, int[] hand) {
int distance = Math.abs(number[0] - hand[0]) + Math.abs(number[1] - hand[1]);
return distance;
}
전체 코드
class Solution {
static StringBuilder sb;
static int[] right;
static int[] left;
public String solution(int[] numbers, String hand) {
left = new int[]{3, 0};
right = new int[]{3, 2};
sb = new StringBuilder();
for(int i = 0; i < numbers.length; i++) {
int number = numbers[i];
useHand(number, hand);
}
return sb.toString();
}
public static void useHand(int number, String hand) {
switch (number) {
case 1 :
sb.append("L");
left[0] = 0; left[1] = 0;
break;
case 2 :
int[] two = {0, 1};
if(calculator(two, left) < calculator(two, right)) {
sb.append("L");
left = two;
break;
} else if(calculator(two, left) > calculator(two, right)) {
sb.append("R");
right = two;
break;
} else {
if("right".equals(hand)) {
sb.append("R");
right = two;
break;
} else {
sb.append("L");
left = two;
break;
}
}
case 3 :
sb.append("R");
right[0] = 0; right[1] = 2;
break;
case 4 :
sb.append("L");
left[0] = 1; left[1] = 0;
break;
case 5 :
int[] five = {1, 1};
if(calculator(five, left) < calculator(five, right)) {
sb.append("L");
left = five;
break;
} else if(calculator(five, left) > calculator(five, right)) {
sb.append("R");
right = five;
break;
} else {
if("right".equals(hand)) {
sb.append("R");
right = five;
break;
} else {
sb.append("L");
left = five;
break;
}
}
case 6 :
sb.append("R");
right[0] = 1; right[1] = 2;
break;
case 7 :
sb.append("L");
left[0] = 2; left[1] = 0;
break;
case 8 :
int[] eight = {2, 1};
if(calculator(eight, left) < calculator(eight, right)) {
sb.append("L");
left = eight;
break;
} else if(calculator(eight, left) > calculator(eight, right)) {
sb.append("R");
right = eight;
break;
} else {
if("right".equals(hand)) {
sb.append("R");
right = eight;
break;
} else {
sb.append("L");
left = eight;
break;
}
}
case 9 :
sb.append("R");
right[0] = 2; right[1] = 2;
break;
case 0 :
int[] zero = {3, 1};
if(calculator(zero, left) < calculator(zero, right)) {
sb.append("L");
left = zero;
break;
} else if(calculator(zero, left) > calculator(zero, right)) {
sb.append("R");
right = zero;
break;
} else {
if("right".equals(hand)) {
sb.append("R");
right = zero;
break;
} else {
sb.append("L");
left = zero;
break;
}
}
}
}
public static int calculator(int[] number, int[] hand) {
int distance = Math.abs(number[0] - hand[0]) + Math.abs(number[1] - hand[1]);
return distance;
}
}