본문으로 바로가기

프로그래머스 2020 카카오 인턴십 키패드 누르기 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

프로그래머스 Level 1 문제로, 문제 자체는 어려운 편이 아니지만 예외 처리해야 하는 것들이 많아서 시간이 조금 걸릴 수 있는 문제다.

 

  1. 키패드는 순서대로 문제에 나와있는 사진과같이 1,2,3,4,5,6,7,8,9,*,0,# 순서로 있다.
  2. (1,4,7) 일때는 무조건 왼손을 사용하고, (3,6,9) 일때는 무조건 오른손을 사용하고, 현재 Left,Right의 위치를 갱신한다.
  3. 시작 위치는 왼손은 *(키패드 상으로 10번째) , 오른손은 #(키패드 상으로 12번째)
  4. 문제는 (2,5,8,0) 인데 여기서 규칙을 찾는것이 가장 중요하다.

->규칙 (키패드-1) / 3 은 X 좌표, (키패드-1) % 3 은 Y 좌표를 구할 수 있다.

 

5. 키패드 0은 11로 바꿔줘야한다. (0의 좌표는 (3,1))
6. 마지막으로, L또는 R이 위치한 좌표와 누르려는 키패드(n) 의 차이를 구한다

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

        int leftLocation = 10;
        int rightLocation = 12;

        for(int number : n) {
            if(number ==1 || number == 4 || number == 7) {
                bd.append("L");
                leftLocation = number;
            }else if(number == 3 || number == 6 || number == 9) {
                bd.append("R");
                rightLocation = number;
            }else { // 2 5 8 0 
                int distanceL = getDist(leftLocation, number);
                int distanceR = getDist(rightLocation, number);

                if(distanceL > distanceR) {
                    bd.append("R");
                    rightLocation = number;
                }else if(distanceL < distanceR) {
                    bd.append("L");
                    leftLocation = number;
                }else {
                    if(hand.equals("right")) {
                        bd.append("R");
                        rightLocation = number;
                    }else {
                        bd.append("L");
                        leftLocation = number;
                    }
                }

            }
        }
        return bd.toString();
    }

    public static int getDist(int location, int number) {

        if(number == 0) {
            number = 11;
        }

        if(location == 0) {
            location = 11;
        }

        int locationX = (location-1) / 3;
        int locationY = (location-1) % 3;

        int numberX = (number-1) / 3;
        int numberY = (number-1) % 3;

        return Math.abs(locationX-numberX) + Math.abs(locationY - numberY);

    }
}