[JS] 프로그래머스 키패드 누르기

bepyan·2021년 4월 16일
0

알고리즘

목록 보기
3/16
post-custom-banner

문제링크

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번 케이스는 왜 차이가 많이 날까?

profile
쿠키 공장 이전 중 🚛 쿠키 나누는 것을 좋아해요.
post-custom-banner

0개의 댓글