키패드 누르기
May 1, 2021
»
JavaScript
키패드 누르기
문제
풀이
- keypad에 1부터 #까지의 2차원 배열 좌표를 생성
- 왼, 오른손가락 위치 변수로 저장
- numbers의 길이만큼 반복 3으로 나눴을때 나머지가 나오면 L을 더해주고 위치 변경 나머지가 안나오면 R을 더해주고 위치 변경 둘다 아니면 equal 함수로 위치를 구함
- dis함수는 매개변수로 누르려는 수, 왼손의 현 위치, 오른손의 현위치, 좌표, 왼손 오른손 여부를 받는다. 현 위치에서 목표점까지 x축 y축 거리를 손마다 lh, rh에 저장한다 만약 lh, rh가 같다면 어느 손잡이인지를 확인해서 해당 손잡이를 넣어주고 같지 않다면 거리가 더 짧은 쪽을 리턴한다
function solution(numbers, hand) {
function equal(num, lh, rh, keypad, hand) {
const lD =
Math.abs(keypad[lh][0] - keypad[num][0]) +
Math.abs(keypad[lh][1] - keypad[num][1]);
const rD =
Math.abs(keypad[rh][0] - keypad[num][0]) +
Math.abs(keypad[rh][1] - keypad[num][1]);
if (lD === rD) return hand === "left" ? "L" : "R";
return lD < rD ? "L" : "R";
}
// 키패드의 x, y 좌표
const keypad = {
1: [0, 0],
2: [0, 1],
3: [0, 2],
4: [1, 0],
5: [1, 1],
6: [1, 2],
7: [2, 0],
8: [2, 1],
9: [2, 2],
"*": [3, 0],
0: [3, 1],
"#": [3, 2],
};
// 왼손 오른손의 현재 좌표 저장, 초기값 *, #
let lh = "*",
rh = "#";
// 정답 넣을 변수
let result = "";
// for ...of으로 배열 순환
for (let num of numbers) {
// 나머지가 있다면 왼손 없다면 오른손
if (num % 3 === 1) {
result += "L"; // 정답에 추가
lh = num; // 위치 변경
} else if (num !== 0 && num % 3 === 0) {
result += "R"; // 정답에 추가
rh = num; // 위치 변경
} else {
// dis에 파라미터로 전달
result += equal(num, lh, rh, keypad, hand);
// dis로 값이 추가됬으므로 현위치 변경
result[result.length - 1] === "L" ? (lh = num) : (rh = num);
}
}
return result;
}