코딩테스트 #25 키패드 누르기 (카카오 2020 인턴 코딩테스트)

Jake Seo·2020년 7월 13일
1

프로그래머스 LV1

목록 보기
25/36

풀이

문제를 간소화하면 1, 4, 7, 3, 6, 9를 받으면 왼손("L")과 오른손("R")의 고정된 문자열을 리턴하고

2, 5, 8, 0를 받는다면 왼손과 오른손의 위치에 따른 거리를 기반으로 가까운 손으로 번호를 누르게 됩니다.

만일 왼손과 오른손의 거리가 같다면, 사용자가 왼손잡이인지 오른손잡이인지에 따라 왼손과 오른손을 결정하게 됩니다.

저는 각 번호의 거리를 계산할 수 있는 함수인 getDistanceXY를 생성하여 풀어보았습니다.

let getDistanceXY = (xy1, xy2) => Math.abs(xy1[0] - xy2[0]) + Math.abs(xy1[1] - xy2[1]);

let solution = (numbers, hand) => {
    let curLeft = "*";
    let curRight = "#";

    let NumberXYObj = {
        1: [0, 0],
        2: [1, 0],
        3: [2, 0],
        4: [0, 1],
        5: [1, 1],
        6: [2, 1],
        7: [0, 2],
        8: [1, 2],
        9: [2, 2],
        "*": [0, 3],
        0: [1, 3],
        "#": [2, 3]
    };
    
    return numbers.map((number) => {
        if(number === 1 || number === 4 || number === 7){
            curLeft = number;
            return "L";
        }else if(number === 3 || number === 6 || number === 9){
            curRight = number;
            return "R";
        }else {
            let distanceFromLeft = getDistanceXY(NumberXYObj[curLeft], NumberXYObj[number]);
            let distanceFromRight = getDistanceXY(NumberXYObj[curRight], NumberXYObj[number]);

            if(distanceFromLeft === distanceFromRight) {
                if(hand === "right") {
                    curRight = number;
                    return "R";
                }
                curLeft = number;
                return "L";
            }else if(distanceFromLeft < distanceFromRight) {
                curLeft = number;
                return "L";
            }
            curRight = number;
            return "R";
        }
    }).join("");
}

코드를 설명하면 위 문제에서 나온 조건을 정말 그대로 코드로 구현한 것이며, 특이한 점은 거리를 구하는 함수 정도인 것 같습니다.

profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글