💡Problem Solving/Programmers

[프로그래머스] 키패드 누르기 (Java)

gom20 2021. 11. 14. 20:24

문제

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

 

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

[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

 

키패드 누르기

풀이

단순 구현 문제로 키패드 좌표를 2차 배열로 만들어 놓고 시작한다.

첫번째 열은 왼쪽, 마지막 열은 오른쪽 손을 사용하며 

중간 열은 왼손, 오른손의 현재 위치와 누를 숫자의 위치 간 거리를 계산하여 거리가 짧은 손으로 키패드를 누른다. 

거리가 같을 경우 왼손잡이/오른손 잡이를 체크하여 진행한다. 

숫자를 누를 때마다 누른 손의 좌표를 갱신해줘야 한다.

소스코드

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        int[][] loc = new int[][]{
            {4, 2},
            {1, 1}, {1, 2}, {1, 3}, 
            {2, 1}, {2, 2}, {2, 3},
            {3, 1}, {3, 2}, {3, 3},
            {4, 1}, {4, 3}
        };
        int[] left = loc[10];
        int[] right = loc[11];
        
        StringBuilder sb = new StringBuilder();
        for(int number : numbers){
            if(number == 1 || number == 4 || number == 7){
                sb.append("L");
                left = loc[number];
                continue;
            }
            if(number == 3 || number == 6 || number == 9){
                sb.append("R");
                right = loc[number];
                continue;
            }
            
            int leftDist = getDistance(loc[number], left);
            int rightDist = getDistance(loc[number], right);
            if(leftDist < rightDist){
                sb.append("L");
                left = loc[number];
            } else if(leftDist > rightDist) {
                sb.append("R");
                right = loc[number];
            } else {
                if("right".equals(hand)){
                    sb.append("R");
                    right = loc[number];
                } else {
                    sb.append("L");
                    left = loc[number];
                }
            }
            
        }
        
        return sb.toString();
    }
    
    private int getDistance(int[] a, int[] b){
        return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);
    }
}