카테고리 없음

[프로그래머스 Level1] 키패드 누르기 (JAVA) - 2020 Kakao

쿠쿠s 2022. 3. 16. 12:40

[문제]

출처 - https://programmers.co.kr/learn/courses/30/lessons/67256?language=java 

 

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

[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


[문제 풀기 전]

예전에 실력이 지금보다 부족할 때 상하좌우 4가지 방향에 이동 한 칸의 거리는 1이니까 bfs 문제인가? 라고 생각을 하고 풀어보려했지만 풀지 못한 기억이 있다. 왼손 오른손이 있고 2, 5 , 8, 0 을 누를때만 가까운 손이 누르도록 하고, 같으면 문제에 주어진 손으로 누르라고 지시하고 해서 그냥 단순 구현으로 해결할 수 있다. 


[문제 풀이]

 

우선 '1, 4, 7' 버튼을 누를 때와 '3, 6, 9' 버튼을 누를 때는 처리가 쉽다. 그냥 해당 버튼이 주어지면 왼손, 오른손을 출력하도록 만들면 된다. 하지만 '2, 5, 8, 0' 이 부분을 처리하는게 살짝 까다로웠다. 문제에 2, 5, 8, 0 은 현재 키패드의 위치에서 더 가까운 손가락을 사용한다고 주어졌다. 따라서 현재 왼손의 위치를 가지는 변수와 오른손의 위치를 가지는 변수를 가지고 입력받은 버튼의 거리의 차이를 구해야 문제에 주어진 '조건 4' 와 '조건 4-1' 을 해결할 수 있다.

그러면 거리는 어떻게 구할 것인가? 하면 키패드는 세로는 3개 가로도 3개 이기 때문에 '현재 위치 - 누르는 위치의 절대값' 을 한 결과를 위 아래로 움직일 때는 '/3 ' 을 해주고, 좌 우 로 움직이는 거리는 '%3' 이니 두개값을 더하면 거리를 구할 수 있다. 그리고 '0' 은 키패드 상에서 실제 위치는 11이므로 입력이 0이 들어왔을때 11로 바꿔줘서 계산을 해준다. 그렇게 해서 문제에서 요구한 대로 구현을 하면 정답을 구할 수 있다.


 

[소스 코드]

class Solution {
    public String solution(int[] numbers, String hand) {
        StringBuilder sb = new StringBuilder();

        int left = 10;
        int right = 12;

        for (int i = 0; i < numbers.length; i++) {
            int n = numbers[i];

            if (n == 1 || n == 4 || n == 7) {
                left = n;
                sb.append("L");
            }
            if (n == 3 || n == 6 || n == 9) {
                right = n;
                sb.append("R");
            }
            if (n == 2 || n == 5 || n == 8 || n == 0) {
                if( n == 0 ) n = 11;

                int leftDiff = (Math.abs(n - left) / 3) + (Math.abs(n - left) % 3);
                int rightDiff =(Math.abs(n - right) / 3) + (Math.abs(n - right) % 3);

                if (leftDiff == rightDiff) {
                    if (hand.equals("right")) {
                        right = n;
                        sb.append("R");
                    }else{
                        left = n;
                        sb.append("L");
                    }
                } else if (leftDiff > rightDiff) {
                    right = n;
                    sb.append("R");
                } else {
                    left = n;
                    sb.append("L");
                }
            }
        }
        return sb.toString();
    }
}