https://programmers.co.kr/learn/courses/30/lessons/67256
천재다 왕천재
키패드의 키 하나하나에 숫자를 주어준다
그래서 *에서 시작하는 왼손은 10, #에서 시작하는 오른손은 12, 가운데 0은 11로 값을 주고
나머지 값들의 row, col을 3의 배수에 따라 정해준다
다음에 움직일 곳이 leftNum인지 rightNum인지도 3으로 나눈 몫과 나머지에 따라서 구하낟
function solution(numbers, hand) {
let leftNum = 10; //*
let rightNum = 12; //#
return numbers
.map((num) => {
if (num === 0) {
num = 11;
}
if (num % 3 === 1) { //1, 4, 7
return leftTo(num);
} else if (num % 3 === 0) { //3,6,9
return rightTo(num);
} else {
const numLocation = numToLocation(num);
const leftDistance = distanceBtwLocation(
numToLocation(leftNum),
numLocation
);
const rightDistance = distanceBtwLocation(
numToLocation(rightNum),
numLocation
);
if (leftDistance === rightDistance) {
return hand === "left" ? leftTo(num) : rightTo(num);
} else if (leftDistance < rightDistance) {
return leftTo(num);
} else {
return rightTo(num);
}
}
})
.join("");
function leftTo(num) {
leftNum = num;
return "L";
}
function rightTo(num) {
rightNum = num;
return "R";
}
}
function numToLocation(num) {
// col : 1을 뺀 몫(ex. 1,2,3 -> 0번째)
// row : num-1을 하고 3으로 나눈 나머지
return [Math.floor((num - 1) / 3), (num - 1) % 3];
}
function distanceBtwLocation(a, b) {
return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);
}
function solution(numbers, hand) {
var answer = '';
//엄지손가락 : 상하좌우 (1)
//왼:1,4,7
//오: 3,6,9
let left = [1,4,7]
let right = [3,6,9]
let places=[0,0]
let pad = [[1,2,3],
[4,5,6],
[7,8,9],
['*', 0, '#']
]
numbers.forEach(el =>
{
if(left.includes(el)){
answer+='L'
places[0]=el
}
else if(right.includes(el)){
answer+='R'
places[1]=el
}
else{
//if row가 같고 col이 1차이
//if col이 같고 row가 1차이
let elIdx = pad.map((p,idx) => p.includes(el) ? [idx, p.indexOf(el)] : null).filter(a => a !== null)
let leftIdx = pad.map((p,idx) => p.includes(places[0]) ? [idx, p.indexOf(places[0])] : null).filter(a => a !== null)
let rightIdx = pad.map((p,idx) => p.includes(places[1]) ? [idx, p.indexOf(places[1])] : null).filter(a => a !== null)
if(Math.abs(elIdx[0] - leftIdx[0] + elIdx[1]-leftIdx[1]) === Math.abs(elIdx[0] - rightIdx[0] + elIdx[1]-rightIdx[1])){
if(hand === "right"){
places[1]=el
answer+='R'
}else{
places[0]=el
answer+='L'
}
}
else if(Math.abs(elIdx[0] - leftIdx[0] + elIdx[1]-leftIdx[1]) < Math.abs(elIdx[0] - rightIdx[0] + elIdx[1]-rightIdx[1])){
answer+='L'
places[0]=el
}
else{
answer+='R'
places[1]=el
}
}
})
return answer
//거리 간과
}