ALGORITHM/Programmers + α

[프로그래머스] lv1. 키패드 누르기

Harimad 2022. 6. 7. 01:26

문제

코딩테스트 연습 - 키패드 누르기 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

코드

function solution(numbers, hand) {
    let answer = '';
    let keyPad = {
        '1' : [0, 0], '2' : [0, 1], '3' : [0, 2],
        '4' : [1, 0], '5' : [1, 1], '6' : [1, 2],
        '7' : [2, 0], '8' : [2, 1], '9' : [2, 2],
        '*' : [3, 0], '0' : [3, 1], '#' : [3, 2]
    }
    let lastLeft='*', lastRight='#', leftX, lextY, rightX, rightY, numX, numY;

   for (let x of numbers) {
        if (x === 1 || x === 4 || x === 7) {		// 1
            answer += 'L', lastLeft = x;
        } else if (x === 3 || x === 6 || x === 9) {	// 2
            answer += 'R', lastRight = x;
        } else {					// 3
            let leftMove =  Math.abs(keyPad[x][0] - keyPad[lastLeft][0]) + Math.abs(keyPad[x][1] - keyPad[lastLeft][1]),
                rightMove = Math.abs(keyPad[x][0] - keyPad[lastRight][0]) + Math.abs(keyPad[x][1] - keyPad[lastRight][1]);
            if (leftMove < rightMove) {
                answer += 'L', lastLeft = x;
            } else if (leftMove > rightMove) {
                answer += 'R', lastRight = x;
            } else {
                if (hand === 'right') {
                    answer += 'R', lastRight = x;
                } else {
                    answer += 'L', lastLeft = x;
                }
            }
        }
   }
    return answer;
}
solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], "left") // LRLLRRLLLRR

 

풀이

(※ 조건

왼손과 오른손의 이동 횟수를 비교해서 더 적은 횟수로 이동한 손을 결정한다.

만약 왼손과 오른손의 이동 횟수가 같으면, 두 번째 인자를 기준으로 손을 결정한다.)

 

1, 4, 7번 키패드를 누를 때는 무조건 왼손으로 누르니까 주석 1번처럼 했고,

3, 6, 9번 키패드를 누를 때는 오른손으로 누르니까 주석 2번 처럼 했다.

 

문제는  2, 5, 8, 0번 키패드를 누를 때(주석 3번) 이다.

내가 문제를 푼 방식은 다음과 같다.

① 변수로 객체를 생성하는데, key는 패드번호로 하고 value는 2차원 배열의 인덱스 값을 넣어준다.

② 왼손이 이동한 값과 오른손이 이동한 값을 변수로 구한다.

③ 왼손의 이동값이 적으면 answer에 'L'을 추가하고, 변수lastLeft를 이동할 값으로 바꾼다.

④ 오른손의 이동값이 적으면 answer에 'R'을 추가하고, 변수lastRight를 이동할 값으로 바꾼다.

⑤ 왼손과 오른손의 이동값이 같으면 두 번째 인자 값을 기준으로 answer 값을 추가하고, lastRight/lastLeft 값을 바꾼다.

 

느낀점

더 나은 방식의 풀이 방법이 있을지 몰라도, (풀이방식이 노가다 스럽지만) 스스로 문제를 풀어보니 스스로가 뿌듯하다.

시간이 많이 걸리더라도, 스스로 문제 풀이에 접근해보는게 중요하다는 것을 다시 깨닫게 되었다.