난이도: Lv. 1
정답률: 51%
문제: https://school.programmers.co.kr/learn/courses/30/lessons/67256
알고리즘
1. 키패드 각각의 좌표 설정
2. 각 숫자를 무슨 손으로 눌렀는지 기록한다.
2-1. 1, 4, 7번을 누를 경우 왼손으로 누른 것이므로 isLeftHand를 참으로 설정
2-2. 3, 6, 9번을 누를 경우 오른손으로 누른 것이므로 isLeftHand를 거짓으로 설정
2-3. 2, 5, 8, 0번인 경우 더 가까운 손이 어느 손인지 판별하여 isLeftHand를 참 또는 거짓으로 설정
3. isLeftHand가 참이면 정답에 'L' 문자를 더하고, 왼손의 현재 위치를 수정한다. isLeftHand가 거짓일 경우 정답에 'R' 문자를 더하고, 오른손의 현재 위치를 수정한다.
코드
function solution(numbers, hand) {
let answer = '';
const position = [
[3, 1], [0, 0], [0, 1],
[0, 2], [1, 0], [1, 1],
[1, 2], [2, 0], [2, 1],
[2, 2], [3, 0], [3, 2]
]
let leftHand = position[10];
let rightHand = position[11];
let isLeftHand = false;
for (const number of numbers) {
if ([1, 4, 7].find((num) => num === number)) { isLeftHand = true; }
else if ([3, 6, 9].find((num) => num === number)) { isLeftHand = false; }
else {
const leftHandDiff = Math.abs(position[number][0] - leftHand[0]) + Math.abs(position[number][1] - leftHand[1]);
const rightHandDiff = Math.abs(position[number][0] - rightHand[0]) + Math.abs(position[number][1] - rightHand[1]);
if (leftHandDiff < rightHandDiff) { isLeftHand = true; }
else if (leftHandDiff > rightHandDiff) { isLeftHand = false; }
else { isLeftHand = hand === 'left' ? true : false; }
}
if (isLeftHand) {
answer += 'L';
leftHand = position[number];
} else {
answer += 'R';
rightHand = position[number];
}
}
return answer;
}
주저리
1단계라고 쉽게 봤는데 아니 사실 쉬운 문제가 맞는데 삽질을 한참 했다. 첫 번째 삽질은 answer 리턴 안 해줘 놓고 왜 undefined가 나오는지 몰라서 문자열 덧셈이 잘못된 줄 알았다. 이걸로 진짜 한참 고민했다. 다음 삽질은 문제에서 분명 상하좌우로 밖에 움직일 수 없다고 했는데 거리차를 유클리드로 구한 것이다. 사실 이거는 질문하기 보고 알았다.
'코딩테스트' 카테고리의 다른 글
[JS] 다리를 지나는 트럭 (0) | 2024.02.29 |
---|---|
[JS] 가장 큰 수 (1) | 2024.02.06 |
[JS] 쿼드압축 후 개수 세기 (0) | 2024.02.01 |
[JS] 2개 이하로 다른 비트 (1) | 2024.01.30 |
[JS] 2 x n 타일링 (1) | 2024.01.25 |