말랑한 하루

[Programmers] 키패드 누르기 (Lv 1, JavaScript) 본문

문제풀이/Programmers

[Programmers] 키패드 누르기 (Lv 1, JavaScript)

지수는말랑이 2022. 6. 30. 17:59
반응형

[ 학습 내용 ]
키패드를 층과 좌, 중, 우로 분할했을 때 해당되는 숫자는

층은 몫으로, 위치는 3n-2, 3n-1, 3n으로 분류할 수 있다.

위 식의 경우 나머지연산을 통해 분류는 가능하나, 우측 몫이 나누어 떨어지는 부분으로 인해 층분류에 알맞지 않았다.

그래서 키패드 전체 수를 1씩 낮춰 2n, 2n+1, 2n+2로 식을 세워 층분류, 좌우분류가 가능하게 만들었다.
전체적인 키패드의 모습은 다음과 같다.

[ 소스 코드 ]

function solution(numbers, hand) {
    var answer = '';
    let left_hand = 9, right_hand = 11;
    
    const onLeft = (number) => {
        answer += "L";
        left_hand = number;
    }
    const onRight = (number) => {
        answer += "R";
        right_hand = number;
    }
    const calcDist = (pad, number) => {
        return Math.abs(parseInt(pad / 3) - parseInt(number / 3)) 
               + Math.abs(pad % 3 - number % 3);
    }
    
    numbers.map((number) => {
        number = number === 0? number = 10 : number - 1;
        switch(number % 3) {
            case 0:
                onLeft(number);
                break;
            case 1:
                let left_dist = calcDist(left_hand, number);
                let right_dist = calcDist(right_hand, number);
                if (left_dist === right_dist) {
                    hand === "left" ? onLeft(number) : onRight(number);
                } else {
                    left_dist < right_dist ? onLeft(number) : onRight(number);
                }
                break;
            case 2:
                onRight(number);
                break;
            
        }
    })
    return answer;
}

 

반응형
Comments