스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
numbers hand result
[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL"
[7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR"
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"
입출력 예 #1
순서대로 눌러야 할 번호가 [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]이고, 오른손잡이입니다.
왼손 위치 오른손 위치 눌러야 할 숫자 사용한 손 설명
* # 1 L 1은 왼손으로 누릅니다.
1 # 3 R 3은 오른손으로 누릅니다.
1 3 4 L 4는 왼손으로 누릅니다.
4 3 5 L 왼손 거리는 1, 오른손 거리는 2이므로 왼손으로 5를 누릅니다.
5 3 8 L 왼손 거리는 1, 오른손 거리는 3이므로 왼손으로 8을 누릅니다.
8 3 2 R 왼손 거리는 2, 오른손 거리는 1이므로 오른손으로 2를 누릅니다.
8 2 1 L 1은 왼손으로 누릅니다.
1 2 4 L 4는 왼손으로 누릅니다.
4 2 5 R 왼손 거리와 오른손 거리가 1로 같으므로, 오른손으로 5를 누릅니다.
4 5 9 R 9는 오른손으로 누릅니다.
4 9 5 L 왼손 거리는 1, 오른손 거리는 2이므로 왼손으로 5를 누릅니다.
5 9 - -
따라서 "LRLLLRLLRRL"를 return 합니다.
입출력 예 #2
왼손잡이가 [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]를 순서대로 누르면 사용한 손은 "LRLLRRLLLRR"이 됩니다.
입출력 예 #3
오른손잡이가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]를 순서대로 누르면 사용한 손은 "LLRLLRLLRL"이 됩니다.
1,4,7 : L
3,6,9 : R
2,5,8,0 : 현재 위치에서 가까운 손, 거리가 같을 때는 hand에 따라.
- 현재 손 위치 계속 업데이트해야 함.
거리를 어떻게 구해야 할 지 잘 모르겠어서 다른 분들의 방식을 참고해 풀어보았다.
-> 이중배열을 이용해 좌표
로 나타내서 거리 구하기!!
function solution(numbers, hand) {
function CalcDistance(val){
let coordinate = [[1,2,3],[4,5,6],[7,8,9],['*',0,'#']];
for(let i=0;i<4;i++){
for(let j=0;j<3;j++){
if(coordinate[i][j] === val) return [i,j];
}
}
}
let answer = '';
let right = '#';
let left = '*';
for(let i=0;i<numbers.length;i++){
if(numbers[i] === 1 || numbers[i] === 4 || numbers[i] === 7){
answer+="L";
left = numbers[i];
}else if(numbers[i] === 3 || numbers[i] === 6 || numbers[i] === 9){
answer+="R";
right = numbers[i] - 2;
}else{
let [r0,r1] = CalcDistance(right);
let [l0,l1] = CalcDistance(left);
let [t0,t1] = CalcDistance(numbers[i]);
if(Math.abs(r0-t0) + Math.abs(r1-t1) > Math.abs(l0-t0) + Math.abs(l1-t1)){ answer+="L";
left = numbers[i];
}else if(Math.abs(r0-t0) + Math.abs(r1-t1) < Math.abs(l0-t0) + Math.abs(l1-t1)){
answer+="R";
right = numbers[i];
}else{
if(hand === "right"){
answer+="R";
right = numbers[i];
}else{
answer+="L";
left = numbers[i];
}
}}
}
return answer;
}
function solution(numbers, hand) {
hand = hand[0] === "r" ? "R" : "L"
let position = [1, 4, 4, 4, 3, 3, 3, 2, 2, 2]
let h = { L: [1, 1], R: [1, 1] }
return numbers.map(x => {
if (/[147]/.test(x)) {
h.L = [position[x], 1]
return "L"
}
if (/[369]/.test(x)) {
h.R = [position[x], 1]
return "R"
}
let distL = Math.abs(position[x] - h.L[0]) + h.L[1]
let distR = Math.abs(position[x] - h.R[0]) + h.R[1]
if (distL === distR) {
h[hand] = [position[x], 0]
return hand
}
if (distL < distR) {
h.L = [position[x], 0]
return "L"
}
h.R = [position[x], 0]
return "R"
}).join("")
}