스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 *
키패드에 오른손 엄지손가락은 #
키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
const solution = (numbers, hand) => {
let answer = '';
let list = {
1: [0, 0],
2: [0, 1],
3: [0, 2],
4: [1, 0],
5: [1, 1],
6: [1, 2],
7: [2, 0],
8: [2, 1],
9: [2, 2],
'*': [3, 0],
0: [3, 1],
'#': [3, 2],
};
//list => 각각 키패드의 번호의 좌표
let left = list['*'];
let right = list['#'];
//left => 초기 시작 왼쪽 손 위치
//right => 초기 시작 오른쪽 손 위치
for (let num of numbers) {
let [i, j] = list[num];
if (j === 0) { //j값이 0이라면 왼쪽 손가락으로만 사용
answer += 'L';
left = list[num];
} else if (j === 2) { //j값이 2이라면 오른쪽 손가락으로만 사용
answer += 'R';
right = list[num];
} else { //가운데일 경우
let tmpL = Math.abs(i - left[0]) + Math.abs(j - left[1]);
//왼쪽 손가락 위치와 현재 i,j의 떨어진 거리
let tmpR = Math.abs(i - right[0]) + Math.abs(j - right[1]);
//오른쪽 손가락 위치와 현재 i,j의 떨어진 거리
if (tmpL > tmpR) {
//떨어진 거리가 더 가까운 경우를 판별해서 해당 손가락으로 사용
right = list[num];
answer += 'R';
} else if (tmpR > tmpL) {
left = list[num];
answer += 'L';
} else if (tmpL === tmpR) {
if (hand === 'left') {
left = list[num];
answer += 'L';
} else {
right = list[num];
answer += 'R';
}
}
}
}
return answer;
};
먼 훗날 다시 꼭 풀어본다. 이렇게 거리 좌표형식의 거리계산 알고리즘은 너무너무 어려운것 같다.