

생각 과정
1. 왼쪽 열의 1 4 7은 반드시 왼손, 오른쪽 열의 3 6 9는 반드시 오른손으로 입력한다.
2. result는 let result = ""로 값을 할당하고, 계산한 결과로 나온 L 혹은 R을 +해준다.
3. "두 손가락의 거리가 같다면" = 거리를 계산하고, if문으로 이를 비교할 필요가 있다.
function findPos(num, phone, hand) {
if (hand === "left") {
for (let i = 0; i < 3; i++) {
if (phone[i][0] === num) return [i, 0];
}
}
if (hand === "right") {
for (let i = 0; i < 3; i++) {
if (phone[i][2] === num) return [i, 2];
}
}
}
function solution(numbers, hand) {
const phone = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
['*', 0, '#']
];
const middleColumn = [2, 5, 8, 0];
let answer = '';
let leftPos = [3, 0];
let rightPos = [3, 2];
for(let i = 0; i < numbers.length; i++) {
let target = numbers[i];
if([1, 4, 7].includes(target)) {
leftPos = findPos(target, phone, "left");
answer += "L";
continue;
}
if([3, 6, 9].includes(target)) {
rightPos = findPos(target, phone, "right");
answer += "R";
continue;
}
const depth = middleColumn.indexOf(target);
const leftDist = Math.abs(leftPos[0] - depth) + Math.abs(leftPos[1] - 1);
const rightDist = Math.abs(rightPos[0] - depth) + Math.abs(rightPos[1] - 1);
if (leftDist < rightDist) {
leftPos = [depth, 1];
answer += "L";
} else if (leftDist > rightDist) {
rightPos = [depth, 1];
answer += "R";
} else {
if (hand === "left") {
leftPos = [depth, 1];
answer += "L";
} else {
rightPos = [depth, 1];
answer += "R";
}
}
}
return answer;
}
알게 된 것들
1. let보다 const로 작성한 상수의 순서가 앞서는 것이(위에 있는 것이) 컨벤션 상 적합하다.
2. const depth = middleColumn.indexOf(target) 으로 배열을 매회 순회하고 있는데...
const depth = target === 0 ? 3 : Math.floor((target - 1) / 3);와 같이 작성해주면
배열 인덱스가 3을 넘지 않으므로 depth에 값을 효율적으로 할당할 수 있다.
'문제 풀이 > Programmers' 카테고리의 다른 글
| [프로그래머스] 64065번: 튜플 (JavaScript) (3) | 2025.07.08 |
|---|---|
| [프로그래머스] 42888번: 오픈 채팅방 (JavaScript) (0) | 2025.07.08 |
| [프로그래머스] 17682번: 다트 게임 (JavaScript) (0) | 2025.07.04 |
| [프로그래머스] 64061번: 크레인 인형뽑기 게임 (JavaScript) (0) | 2025.07.04 |
| [프로그래머스] 72410번: 신규 아이디 추천 (JavaScript) (0) | 2025.07.04 |