본문 바로가기
Algorithm/프로그래머스[Programmers]

[JS] 2020카카오 : 키패드 누르기 프로그래머스 LEVEL1

by jgo 2022. 6. 26.

문제 링크

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

풀이 전략

엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

코드 

const keypad = [
    ["1", "2", "3"],
    ["4", "5", "6"],
    ["7", "8", "9"],
    ["*", "0", "#"],
];

console.log(solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], "right"));
console.log(solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], "left"));
console.log(solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], "right"));

function solution(numbers, hand) {
    let leftL = "*";
    let rightL = "#";
    let answer = "";

    for (const number of numbers) {
        if (number % 3 === 1) {
            answer += "L";
            leftL = String(number);
        } else if (number % 3 === 0 && number !== 0) {
            answer += "R";
            rightL = String(number);
        } else {
            const [lDis, rDis] = getDis(String(number), leftL, rightL);
            if (lDis > rDis) {
                answer += "R";
                rightL = String(number);
            } else if (lDis < rDis) {
                answer += "L";
                leftL = String(number);
            } else {
                if (hand === "right") {
                    answer += "R";
                    rightL = String(number);
                } else {
                    answer += "L";
                    leftL = String(number);
                }
            }
        }
    }

    return answer;
}

function getDis(target, left, right) {
    const [lx, ly] = getLocation(left);
    const [rx, ry] = getLocation(right);
    const [tx, ty] = getLocation(target);

    const lDis = Math.abs(tx - lx) + Math.abs(ty - ly);
    const rDis = Math.abs(tx - rx) + Math.abs(ty - ry);

    return [lDis, rDis];
}

function getLocation(target) {
    for (let i = 0; i < 4; i++) {
        for (let j = 0; j < 3; j++) {
            if (keypad[i][j] === target) {
                return [i, j];
            }
        }
    }
}

 

회고

처음엔 상하좌우 4가지 방향이라는 단어에 꽂혀 bfs를 구현하였다.....너무 미련하였지만 어찌어찌 구현은 성공하였는데, 나중에 다시 보니 점과 점사이의 거리로 쉽게 풀 수 있을 것같아 코드를 갈아엎고 다시 풀었다. 
전체적인 구현방법은 왼쪽 열 3개는 무조건 왼손, 오른쪽 열 3개는 무조건 오른손이기 때문에 현재 손가락의 위치를 저장할 변수를 만들어놓고 눌러야할 키패드와 현재 왼손, 오른손 까지의 거리를 구하여서 케이스를 하나하나 나누어 구현하였다. 

 

더 좋은 방법이나 의견이 있으시다면 댓글 부탁드립니다 :)

댓글