function solution(numbers, hand) {
let ans = "";
// 스마트폰 키패드를 좌표로 표현
let phone = {
1: [1,1], 2: [1,2], 3: [1,3],
4: [2,1], 5: [2,2], 6: [2,3],
7: [3,1], 8: [3,2], 9: [3,3],
"*": [4,1], 0: [4,2], "#": [4,3]
};
// 왼손과 오른손의 시작점을 명시
let Llocation = phone["*"];
let Rlocation = phone["#"];
for(let i = 0; i < numbers.length; i++){
let number = numbers[i];
if(number === 1 || number === 4 || number === 7){
ans += "L";
Llocation = phone[number];
} else if (number === 3 || number === 6 || number === 9){
ans += "R";
Rlocation = phone[number];
} else {
// 가고자하는 키패드의 좌표
let wantToMove = phone[number];
// 왼손에서의 거리
let distanceL = [Math.abs(wantToMove[0] - Llocation[0]), Math.abs(wantToMove[1] - Llocation[1])];
let distanceFromL = distanceL[0] + distanceL[1];
// 오른손에서의 거리
let distanceR = [Math.abs(wantToMove[0] - Rlocation[0]), Math.abs(wantToMove[1] - Rlocation[1])];
let distanceFromR = distanceR[0] + distanceR[1];
// 거리가 같으면
// hand에 따라서 움직인다.
if(distanceFromL === distanceFromR){
if(hand === "right"){
ans += "R";
Rlocation = phone[number];
} else {
ans += "L";
Llocation = phone[number];
}
} else {
// 거리가 다르면
// 거리가 더 짧은 쪽 손이 움직인다.
if(distanceFromL < distanceFromR){
ans += "L";
Llocation = phone[number];
} else {
ans += "R";
Rlocation = phone[number];
}
}
}
}
return ans;
}
2차원 배열로 풀어보려고도 했고, 그냥 input만 가지고 풀어보려고도 했지만
예외 처리에서 상당히 애를 먹어서
결국 키패드를 좌표로 변환해서 푸는 방법을 선택했다.
좌표로 표현하는 순간부터 굉장히 문제가 쉬워진다.
주의할 것은 distanceL, distanceR을 구할 때
좌표가 작은 것에서 큰 것을 빼면 음수가 되어 연산이 이상해지므로
Math.abs()를 사용해줘야하는 것이다.
추가로, 거리가 더 짧은 쪽의 손이 움직이는 것이므로
분기 처리를 헷갈리지않도록 신경 써야한다.