Algorithm/programmers
[NodeJS] 프로그래머스 키패드 누르기
castlemo
2022. 8. 15. 10:42
728x90
/**
* @link https://school.programmers.co.kr/learn/courses/30/lessons/67256?language=javascript
*/
const solution = (nums, hand) => {
let answer = '';
const handNumMap = {
left: 10,
right: 11,
};
const leftNums = [1, 4, 7];
const rightNums = [3, 6, 9];
const numsPosition = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 0, 11],
];
const updateAnswer = (num, h) => {
handNumMap[h] = num;
answer += h === 'left' ? 'L' : 'R';
};
const findIndex = (num) => {
for (let i = 0; i < 4; i++) {
for (let j = 0; j < 3; j++) {
if (numsPosition[i][j] === num) {
return [i, j];
}
}
}
};
for (const num of nums) {
if (leftNums.includes(num)) {
updateAnswer(num, 'left');
} else if (rightNums.includes(num)) {
updateAnswer(num, 'right');
} else {
const leftIdx = Number.isNaN(Number(handNumMap.left))
? [10, 10]
: findIndex(handNumMap.left);
const rightIdx = Number.isNaN(Number(handNumMap.right))
? [10, 10]
: findIndex(handNumMap.right);
const numIdx = findIndex(num);
const leftDistance =
Math.abs(numIdx[0] - leftIdx[0]) + Math.abs(numIdx[1] - leftIdx[1]);
const rightDistance =
Math.abs(numIdx[0] - rightIdx[0]) + Math.abs(numIdx[1] - rightIdx[1]);
if (leftDistance === rightDistance) {
updateAnswer(num, hand);
} else if (leftDistance < rightDistance) {
updateAnswer(num, 'left');
} else {
updateAnswer(num, 'right');
}
}
}
return answer;
};
728x90