> 기초/코테 연습

TIL-2024.04.10 - 코테연습 - kakao -키패드 누르기(1).programmers

Janku 2024. 4. 10. 22:52

 

 

 

URL:

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

내가 푼 코드:

 

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

const solution = (numbers, hand) => {
    /**
     * 조건 1. 손은 상하좌우 (대각선 불가 - 유클리드 > 맨하튼), 1칸씩 이동 가능
     * 조건 2. [1 , 4 , 7] 은 왼손으로만 & [3 ,6, 9] 는 오른손으로만 입력 가능
     * 조건 3. [2 , 5 , 8 , 0 ]은 키패드에 더 가까운 손으로 입력
     * 조건 4. [2 , 5 , 8 , 0 ]을 입력할때 거리가 같으면, 오른손잡이는 오른손으로, 왼손잡이는 왼손 사용
     */

    const keypadArr = [
        [1, 4, 7, "*"],
        [2, 5, 8, 0],
        [3, 6, 9, "#"]
    ];
    let currentLeftPosition = [0, 3]; // 왼손의 초기 위치 '*'
    let currentRightPosition = [2, 3]; // 오른손의 초기 위치 '#'
    let result = "";

    const fnGetDistance = (x1, y1, x2, y2) => {
        // 두 위치 사이의 맨하튼 거리를 계산하여 반환
        return Math.abs(x2 - x1) + Math.abs(y2 - y1);
    };

    for (let i = 0; i < numbers.length; i++) {
        if ([1, 4, 7].includes(numbers[i])) {
            // 왼손으로 입력해야 하는 경우
            const temp = [1, 4, 7].indexOf(numbers[i]);
            result += "L";
            currentLeftPosition = [0, temp]; // 왼손의 위치 업데이트
        } else if ([3, 6, 9].includes(numbers[i])) {
            // 오른손으로 입력해야 하는 경우
            const temp = [3, 6, 9].indexOf(numbers[i]);
            result += "R";
            currentRightPosition = [2, temp]; // 오른손의 위치 업데이트
        } else {
            // 가운데 키패드 숫자인 경우
            for (let j = 0; j < keypadArr.length; j++) {
                for (let k = 0; k < keypadArr[j].length; k++) {
                    if (numbers[i] === keypadArr[j][k]) {
                        // 입력하려는 숫자의 위치를 찾았을 때
                        const right = fnGetDistance(j, k, currentRightPosition[0], currentRightPosition[1]); // 오른손과의 거리 계산
                        const left = fnGetDistance(j, k, currentLeftPosition[0], currentLeftPosition[1]); // 왼손과의 거리 계산

                        if (right > left) {
                            // 왼손이 더 가까운 경우
                            result += "L";
                            currentLeftPosition = [j, k]; // 왼손의 위치 업데이트
                        } else if (left > right) {
                            // 오른손이 더 가까운 경우
                            result += "R";
                            currentRightPosition = [j, k]; // 오른손의 위치 업데이트
                        } else {
                            // 거리가 같은 경우
                            if (hand === "right") {
                                // 오른손잡이인 경우
                                result += "R";
                                currentRightPosition = [j, k]; // 오른손의 위치 업데이트
                            } else {
                                // 왼손잡이인 경우
                                result += "L";
                                currentLeftPosition = [j, k]; // 왼손의 위치 업데이트
                            }
                        }
                        break; // 입력한 숫자 처리 후 반복문 종료
                    }
                }
            }
        }
    }
    return result; // 최종 결과 반환
};


// console.log("result:: ", solution([ 1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5 ], "right")); //"LRLLLRLLRRL"
// console.log("result:: ", solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], "left")); // "LRLLRRLLLRR"
// console.log("result:: ", solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], "right")); //"LLRLLRLLRL"
console.log("result:: ", solution([ 0, 0 ], "right")); // "RR"