[문제]
출처 - https://programmers.co.kr/learn/courses/30/lessons/67256?language=java
[문제 풀기 전]
예전에 실력이 지금보다 부족할 때 상하좌우 4가지 방향에 이동 한 칸의 거리는 1이니까 bfs 문제인가? 라고 생각을 하고 풀어보려했지만 풀지 못한 기억이 있다. 왼손 오른손이 있고 2, 5 , 8, 0 을 누를때만 가까운 손이 누르도록 하고, 같으면 문제에 주어진 손으로 누르라고 지시하고 해서 그냥 단순 구현으로 해결할 수 있다.
[문제 풀이]
우선 '1, 4, 7' 버튼을 누를 때와 '3, 6, 9' 버튼을 누를 때는 처리가 쉽다. 그냥 해당 버튼이 주어지면 왼손, 오른손을 출력하도록 만들면 된다. 하지만 '2, 5, 8, 0' 이 부분을 처리하는게 살짝 까다로웠다. 문제에 2, 5, 8, 0 은 현재 키패드의 위치에서 더 가까운 손가락을 사용한다고 주어졌다. 따라서 현재 왼손의 위치를 가지는 변수와 오른손의 위치를 가지는 변수를 가지고 입력받은 버튼의 거리의 차이를 구해야 문제에 주어진 '조건 4' 와 '조건 4-1' 을 해결할 수 있다.
그러면 거리는 어떻게 구할 것인가? 하면 키패드는 세로는 3개 가로도 3개 이기 때문에 '현재 위치 - 누르는 위치의 절대값' 을 한 결과를 위 아래로 움직일 때는 '/3 ' 을 해주고, 좌 우 로 움직이는 거리는 '%3' 이니 두개값을 더하면 거리를 구할 수 있다. 그리고 '0' 은 키패드 상에서 실제 위치는 11이므로 입력이 0이 들어왔을때 11로 바꿔줘서 계산을 해준다. 그렇게 해서 문제에서 요구한 대로 구현을 하면 정답을 구할 수 있다.
[소스 코드]
class Solution {
public String solution(int[] numbers, String hand) {
StringBuilder sb = new StringBuilder();
int left = 10;
int right = 12;
for (int i = 0; i < numbers.length; i++) {
int n = numbers[i];
if (n == 1 || n == 4 || n == 7) {
left = n;
sb.append("L");
}
if (n == 3 || n == 6 || n == 9) {
right = n;
sb.append("R");
}
if (n == 2 || n == 5 || n == 8 || n == 0) {
if( n == 0 ) n = 11;
int leftDiff = (Math.abs(n - left) / 3) + (Math.abs(n - left) % 3);
int rightDiff =(Math.abs(n - right) / 3) + (Math.abs(n - right) % 3);
if (leftDiff == rightDiff) {
if (hand.equals("right")) {
right = n;
sb.append("R");
}else{
left = n;
sb.append("L");
}
} else if (leftDiff > rightDiff) {
right = n;
sb.append("R");
} else {
left = n;
sb.append("L");
}
}
}
return sb.toString();
}
}