알고리즘/programmers

프로그래머스 레벨 1 키패드 누르기 알고리즘 (JAVA)

dev-jo 2021. 7. 10. 17:08

 

 

오늘 푼 문제는

 

프로그래머스 레벨 1 키패드다

 

모든 코드는 GitHub  올려놓았다.

 

드디어 프로그래머스 레벨 1 마지막 문제다 ( sql 포함 )

 

 

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

 

코드는..

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

        int left = 42;
        int right = 35;

        for(int i=0; i<numbers.length; i++) {
            int a = numbers[i];
            if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7 || left == numbers[i]) {
                left = numbers[i];
                answer.append("L");
            } else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9 || right == numbers[i]) {
                right = numbers[i];
                answer.append("R");
            } else {
                if(distance(left,right,numbers[i], hand)) {
                    right = numbers[i];
                    answer.append("R");
                } else {
                    left = numbers[i];
                    answer.append("L");
                }
            }
        }
        return answer.toString();

    }

    private boolean distance (int left, int right, int num , String hand) { // right 가까우면 ture // left 가 가까우면 false

        int[] leftDistance = new int[2];
        int[] rightDistance = new int[2];
        int[] numArr = new int[2];

        int[][] key = new int[][]{
                {1,2,3},
                {4,5,6},
                {7,8,9},
                {42,0,35}
        };

        for(int i=0; i<key.length; i++) {
            for(int j=0; j<key[j].length; j++) {
                if(left == key[i][j]) {
                    leftDistance[0] = i;
                    leftDistance[1] = j;
                }
                if(right == key[i][j]) {
                    rightDistance[0] = i;
                    rightDistance[1] = j;
                }
                if(num == key[i][j]) {
                    numArr[0] = i;
                    numArr[1] = j;
                }
            }
        }
        int leftNum = Math.abs(numArr[0] - leftDistance[0]) + Math.abs(numArr[1] - leftDistance[1]);
        int rightNum = Math.abs(numArr[0] - rightDistance[0]) + Math.abs(numArr[1] - rightDistance[1]);
        if(leftNum == rightNum) {
            if(hand.equals("right")) {
                return true;
            } else {
                return false;
            }
        }
        return rightNum < leftNum;
    }
}

 

더 짧게 줄일 수 있을 거 같지만..

 

풀다가 자버려서 중간까지만 그냥 빠르게 풀었다..

 

1 4 7 은 무조건 왼손이고

 

3 6 9는 오른손이니 if 문으로 걸러준다.

 

나머지 2580 이문제인데

 

현재 손의 위치의 index를 기준으로

 

이동거리를 계산해준다

 

예를 들자면

 

현재  왼손은 4고 , 오른손은 3  눌러야 할 키패드는 5번이다

 

 

그럼 왼손은 1,0 , 오른손은 0,2 , 눌러야 할 5번은 1,1이다

 

계산을 하면 이렇게 된다

 

각 자릿수만큼 빼준다. 그리고 음수일 경우 양수로 바꿔준 후 더해준다.

 

왼손 : ( 1-1) + ( 0 - 1 )  > 0 + -1 = -1이다 -1을 음수를 양수로 변환시키면 

1이 되고 4에서 5를 누르려면 1칸 동일하다.

 

오른손: ( 0 - 1) + ( 2 - 1 ) =  -1 + 1이다 여기도 음수를 양수로 변경해주고. 더하면

 

2가 된다 3에서 5까지의 거리는 2다..

 

이렇게 낮은 수의 손으로 클릭을 시켜주면 된다..!

 

 

 

주말이나.. 시간 날 때.. 2 5 8 0 계산하는 부분을 다듬어 봐야겠다 

 

너무 더럽다..

 

아무튼!

 

 

프로그래머스 레벨 1 전부 풀었다!! 

이제 알고리즘 책 좀 보고 2 레벨에 도전할 예정이다..