https://programmers.co.kr/learn/courses/30/lessons/67256
키패드를 아래와 같이 치환했다.
차이값이 겹치지 않고 케이스가 몇몇 없어보여서 그냥 다 명시하면 되겠다 생각했다
1 2 3
4 5 6
7 8 9
10 11 12
function solution(numbers, hand) {
var left = 10, right = 12;
const useLeft = n => { left = n; return 'L'; }
const useRight = n => { right = n; return 'R'; }
const getDist = (d) => {
switch (d > 0 ? d : -d) {
case 0: return 0;
case 1: case 3: return 1;
case 2: case 4: case 6: return 2;
case 5: case 7: case 9: return 3;
case 8: case 10: return 4;
}
}
return numbers.map(n => {
switch (n) {
case 1: case 4: case 7: return useLeft(n);
case 3: case 6: case 9: return useRight(n);
default:
n = n ? n : 11;
const dis = getDist(left - n) - getDist(right - n);
if (dis === 0)
return hand === "right" ? useRight(n) : useLeft(n);
return dis > 0 ? useRight(n) : useLeft(n);
}
}).join(``);
}
생각치 못한 예외상황이 있어서 디버깅에 시간을 많이 할애했다... 그래도 성공
거리가 0인 경우,, 대각선 이동,, 종에서의 이동,,
키패드를 배열로 2차원 배열로 매핑하여 x축 차이 + y축 차이로 거리를 계산한다.
훨씬 알고리즘이 직관적이고 깔끔하다. 코드 확장성도 좋고
function solution(numbers, hand) {
var left = '*', right = '#';
const useLeft = n => { left = n; return 'L'; }
const useRight = n => { right = n; return 'R'; }
const abs = n => n > 0 ? n : -n;
const getDist = (from, [x, y]) => {
return abs(keypad[from][0] - x) + abs(keypad[from][1] - y);
}
const keypad = {
1: [0, 3], 2: [1, 3], 3: [2, 3],
4: [0, 2], 5: [1, 2], 6: [2, 2],
7: [0, 1], 8: [1, 1], 9: [2, 1],
'*': [0, 0], 0: [1, 0], '#': [2, 0]
}
return numbers.map(n => {
switch (n) {
case 1: case 4: case 7: return useLeft(n);
case 3: case 6: case 9: return useRight(n);
default:
const dist = getDist(left, keypad[n]) - getDist(right, keypad[n]);
if (dist === 0)
return hand === "right" ? useRight(n) : useLeft(n);
return dist > 0 ? useRight(n) : useLeft(n);
}
}).join(``);
}
그래도 나는 거리를 계산한 것이 아니라 속도가 더 빠르긴 하드라
근데 이게 LV 1이라니..
18번 케이스는 왜 차이가 많이 날까?