따봉도치야 고마워

[프로그래머스] 카카오 인턴 키패드 입력 본문

프로그래밍/알고리즘

[프로그래머스] 카카오 인턴 키패드 입력

따봉도치 2021. 10. 3. 21:43

https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

 

풀이

가운데 키패드와 거리를 어떻게 재느냐가 문제였는데, 배열 x,y 좌표의 차이로 계산을 했다.

빠르게 찾기 위해 키패드 값을 key로 x, y 값을 계산해서 넣었다

x = 숫자 idx / 3 
y = 숫자 idx % 3

위와 같이 계산 시 

 

첫 행에 있는 요소들은 (1,2,3) x 가 0, 두번째 세번째부터 순서대로 증가하고

각 열에 있는 요소는 0 ~ 2 로 반복 된다.

 

코드

function solution(numbers, hand) {
    const keyMap = createKeyMap();
    var answer = '';
    var hands = {
        left: '*',
        right: '#'
    };

    for (const n of numbers) {
        if ([1, 4, 7].includes(n)) {
            hands.left = n;
            answer += 'L';
        }
        else if ([3, 6, 9].includes(n)) {
            hands.right = n;
            answer += 'R';
        }
        else {
            const distWithLeft = distance(keyMap, n, hands.left);
            const distWithRight = distance(keyMap, n, hands.right)
            
            if (distWithLeft < distWithRight) {
                hands.left = n;
                answer += 'L';
            }
            else if (distWithLeft > distWithRight) {
                hands.right = n;
                answer += 'R';
            }
            else {
                hands[hand] = n;
                answer += (hand === 'left') ? 'L' : 'R';
            }
        } 
    }
    return answer;
}

function createKeyMap() {
    const keyNums = [
        1, 2, 3,
        4, 5, 6,
        7, 8, 9,
        '*', 0, '#'
    ];
    const keyMap = {};

    for (const idx in keyNums) {
        const key = keyNums[idx];
        const x = Math.floor(idx / 3);
        const y = idx % 3; // y is in 0..2;

        keyMap[key] = {x, y};
    }
    
    return keyMap;
}

function distance(keyMap, n, handValue) {
    const N = keyMap[n];
    const HAND = keyMap[handValue];
    return Math.abs(N.x - HAND.x) + Math.abs(N.y - HAND.y);
}
Comments