본문 바로가기

알고리즘 풀이/프로그래머스

[프로그래머스] 키패드 누르기 / 2020 카카오 인턴십 - JAVA

🔗 문제 링크

[프로그래머스] 키패드 누르기 / 2020 카카오 인턴십

 

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

[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

 

📝 풀이 과정

1 2 3
4 5 6
7 8 9
*(10) 0(11) #(12)

계산을 쉽게 하기 위해 키패드를 모두 숫자로 취급하였다. 1~9까지 숫자키패드는 그대로 두고, *, 0, # 등의 키패드를 10, 11, 12로 보았다.

 

따라서, 제일 처음 왼손은 10, 오른손은 12에 위치하고 있다고 가정하였다. 문제에서 손의 위치와 키패드의 거리가 가까운 손을 사용하고, 같을 때에는 hand 파라미터로 주어진 손을 사용한다고 했기 때문에 거리를 계산하기 위한 getDiff(prev, num)함수를 구현하였다.

 

int getDiff(int prev, int num) {
    return Math.abs(prev - num) / 3 + Math.abs(prev - num) % 3;
}

손의 위치와 누를 번호의 거리는 차를 3으로 나눈 몫나머지의 합과 일치하기 때문에 이를 사용해 거리를 반환해주었고, 이를 사용해 사용할 손을 선택해 버튼을 눌러주었다.

 

💻 코드

class Solution {
    StringBuilder sb = new StringBuilder();
    int prevL = 10, prevR = 12;

    public String solution(int[] numbers, String hand) {
        char handDefault = hand.equals("right") ? 'R' : 'L';
        for (int n : numbers) {
            if (n == 0 || n % 3 == 2) {
                if (n == 0) n = 11;
                int diff = getDiff(prevL, n) - getDiff(prevR, n);

                push(n, diff < 0 ? 'L' : (diff > 0 ? 'R' : handDefault));
            } else push(n, n % 3 == 1 ? 'L' : 'R');
        }
        return sb.toString();
    }

    void push(int n, char hand) {
        sb.append(hand);

        if (hand == 'L') prevL = n;
        else prevR = n;
    }

    int getDiff(int prev, int num) {
        return Math.abs(prev - num) / 3 + Math.abs(prev - num) % 3;
    }
}