본문 바로가기
Coding Test/JavaScript

[Javascript] (프로그래머스 level 1) 키패드 누르기

by Chaedie 2022. 7. 1.
728x90

[Javascript] (프로그래머스 level 1) 키패드 누르기

💡 구글에 Javascript 풀이가 많이 없거나, 배운 점이 있으면 포스팅합니다.

내 풀이

function solution(numbers, hand) {
    const answer = {
        powerHand : hand === 'left' ? 'L' : 'R',
        result : [],
        preLt : 10,
        preRt : 11,
    } 

    let [l, r] = ['L', 'R'];
    for (let num of numbers) {
        // 147 왼손
        if ([1, 4, 7].includes(num)) {
            answer.result.push(l);
            answer.preLt = num;
            continue;
        // 369 오른손
        } else if ([3, 6, 9].includes(num)) {
            answer.result.push(r);
            answer.preRt = num;
            continue;
        // 2580 checkNear(); 
        } else {
            // 거리 같으면 오른손잡이-오른손 왼잡-왼
            let nearHand = checkNear(num, answer);
            answer.result.push(nearHand)
            if (nearHand === l) {
                answer.preLt = num;
            } else {
                answer.preRt = num;
            }
        }
    }    

    return answer.result.join('');
}

function checkNear(target, answer) {
    const pos = [[3, 1], 
        [0, 0], [0, 1], [0, 2],
        [1, 0], [1, 1], [1, 2],
        [2, 0], [2, 1], [2, 2], 
        [3, 0],         [3, 2]]; 
        // * === 10, # === 11

    let x = Math.abs(pos[answer.preLt][0] - pos[target][0]);
    let y = Math.abs(pos[answer.preLt][1] - pos[target][1]);
    let distLt = x + y;

    x = Math.abs(pos[answer.preRt][0] - pos[target][0]);
    y = Math.abs(pos[answer.preRt][1] - pos[target][1]);
    let distRt = x + y;

    // 만약 거리가 같다면 return answer.hand
    if (distLt === distRt) {
        return answer.powerHand;
    }

    // 두 거리 중 작은거 return minDistance
    return Math.min(distLt, distRt) === distLt ? 'L' : 'R';

}
  • “이것보다 좀 더 좋은 방법이 없을까?” 했는데, 다른 분들도 대부분 비슷하게 푼 것 같습니다.

배운 점, 느낀 점

  • 풀면서 아쉬운 점은 구현을 다 하고, 테스트 케이스 3개가 안맞아서 “맞왜틀”을 좀 했는데요. 원인은 position 배열에서 ‘*’ 과 ‘#’의 위치가 인덱스 10, 11 인데 주석에 9 10 으로 잘못 적어둔게 원인이었습니다. 이걸로 10분이상 날렸네요.
  • 풀이에 총 45분 걸렸는데, 이 당시 4시간 5문제였고, 이 문제가 1번이라 난이도가 쉬운거라 감안했을 때 너무 느리게 풀었다고 판단됩니다.
  • 구현 연습을 많이 하면서 구현에 드는 시간을 줄이는게 중요해보입니다.
  • 또한 구현할 때 틀린 부분없이 구현 하도록 조심해서 주석을 작성해야겠습니다.

2020 카카오 인턴십 문제 해설

댓글