문제풀이/코딩테스트

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

gyungmean 2022. 2. 15. 18:18

문제출처

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

3가지로 나눠서 풀어야겠다고 생각했다.

-1, 4, 7 => 무조건 왼손

-3, 6, 9 => 무조건 오른선

-2, 5, 8, 0 => 거리 측정

 

*, 0, #은 각각 10, 11, 12로 바꿔서 생각함

 

길이는 왼손이 있을 수 있는 위치 1, 4, 7, 11과 2, 5, 8, 0으로 나누어서 생각했다. 오른손도 마찬가지

1, 4, 7, 11일때는 가운데로 한칸 이동한다고 가정한 후 가운데에서 2, 5, 8, 0까지의 위치를 계산

오른손의 경우에도 마찬가지로 계산 후 각각 거리를 구한다.

 

거리끼리 비교 후 할일을 해주면 끝

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        int now_left = 10, now_right = 12;
        for(int n : numbers){
            if(n == 0) {n = 11;}
            if(n == 1 || n == 4 || n == 7){
                answer += "L";
                now_left = n;
            }
            else if(n == 3 || n == 6 || n == 9){
                answer += "R";
                now_right = n;
            }
            else{
                int left_d, right_d;
                if(now_left == 1 || now_left == 4 || now_left == 7 || now_left == 10){
                    if(Math.abs(now_left - n) == 1){
                        left_d = 1;
                    }
                    else{
                        left_d = Math.abs((now_left + 1) - n) / 3 + 1;
                    }
                }
                else{
                    left_d = Math.abs(now_left - n) / 3;
                }
                if(now_right == 3 || now_right == 6 || now_right == 9 || now_right == 12){
                    if(Math.abs(now_right - n) == 1){
                        right_d = 1;
                    }
                    else{
                        right_d = Math.abs((now_right - 1) - n) / 3 + 1;
                    }
                }
                else{
                    right_d = Math.abs(now_right - n) / 3;
                }
                if(left_d == right_d){
                    if(hand.equals("left")){
                        answer += "L";
                        now_left = n;
                    }
                    else{
                        answer += "R";
                        now_right = n;
                    }
                }
                else{
                    if(left_d < right_d){
                        answer += "L";
                        now_left = n;
                    }
                    else{
                         answer += "R";
                        now_right = n;
                    }
                }
            }
        }
        return answer;
    }
}

다른 풀이를 보니 좌표 형식으로 푸는 방법도 있고, 나랑 비슷한 방법도 있고 뭐가 더 좋은 풀이인지 아직 판별하기 어렵다... 오늘은 우선 여기서 끝