https://programmers.co.kr/learn/courses/30/lessons/67256
const phone = {
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],
}
function solution(numbers, hand) {
let leftH = '*';
let rightH = '#';
let answer = '';
let len = numbers.length;
for (let i = 0; i < len; i++) {
switch (numbers[i]) {
case 1: case 4: case 7:
answer += 'L';
leftH = numbers[i];
break;
case 3: case 6: case 9:
answer += 'R';
rightH = numbers[i];
break;
case 2: case 5: case 8: case 0:
let arrow = calculate(numbers[i], leftH, rightH, hand);
answer += arrow;
arrow == 'R' ? rightH = numbers[i] : leftH = numbers[i];
break;
}
}
return answer;
}
function calculate(number, leftH, rightH, hand) {
let middle = phone[number];
let left = phone[leftH];
let right = phone[rightH];
hand == 'left' ? hand = 'L' : hand = 'R';
let left_distance = Math.abs(left[0] - middle[0]) + Math.abs(left[1] - middle[1]);
let right_distance = Math.abs(right[0] - middle[0]) + Math.abs(right[1] - middle[1]);
console.log(`l : ${left_distance}, r : ${right_distance}`)
if (left_distance > right_distance) return 'R';
else if (left_distance < right_distance) return 'L';
else return hand;
}
// let numbers = [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5];
// let hand = "right";
let numbers = [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2];
let hand = "left";
console.log(solution(numbers, hand));
/*
1 2 3
4 5 6
7 8 9
* 0 #
*/
생각보다 해맷던 문제이다.
우선 들어오는 숫자에 따라 L인지 R인지 추가해주고, 가운데 라인의 경우 계산하는 calculate로 L인지 R인지 계산해서 return해주려 했다.
근데 문제가 위의 설명만 읽고 아 거리구하는 문제구나 라고 생각하여 calculate에서 거리 계산하는 공식으로 풀었는데 13 - 20까지 테스트케이스가 다틀렸다고 나왔다.
내가 공식을 잘못썻나? 하고 console로 찍어보며 하나하나 다 확인해보고, 모르겠어서 질문게시판에 가서 해결책을 얻었다.
이번 문제는 두 점 사이의 거리가 거리가 아니고 1칸씩 이동했을 때의 거리다.
아래 설명들을 잘 읽어보면 소수점이 나와야될부분이 1칸씩이동한 크기로 설명이 나와있다.