새소식

반응형
250x250
Programmers/Lv.1

프로그래머스 - 키패드 누르기

  • -
728x90
반응형

 

이 문제도 크게 어려움 없이 풀었다. 

다만 거리계산을 할 때, 나는 피타고라스를 썼지만

이 문제는 맨해튼 거리 계산법을 사용했기에 그 부분을 살짝 헤맸지만

그걸 제외하고는 크게 어려운 부분은 없는 것 같다.

 

초기 설정 : 왼손과 오른손의 초기 위치는 각각 * 과 # 이다. 이를 좌표로 표현하면 [3, 0] , [3, 2] 이다.

left = new int[]{3, 0};
right = new int[]{3, 2};

 

입력 숫자 처리 : 주어진 숫자 배열 numbers를 순회하며 입력된 숫자에 따른 처리를 한다. 숫자 위치는 키패드를 2차원

배열 형태로 생각하면 될 것이고 [행, 열]로 표현된다.

for(int i = 0; i < numbers.length; i++) {
	int number = numbers[i];
    useHand(number, hand);
}

 

손가락 사용 결정 

  • 숫자 1, 4, 7은 항상 왼손으로 입력한다.
  • 숫자 3, 6, 9는 항상 오른손으로 입력한다.
  • 숫자 2, 5, 8, 0은 더 가까운 손으로 입력하고, 두 손과의 거리가 같을 때에는 hand로 주어진 손을 사용해 입력한다.
public static void useHand(int number, String hand) {
        switch (number) {
            case 1 :
                sb.append("L");
                left[0] = 0; left[1] = 0;
                break;
            case 2 :
                int[] two = {0, 1};
                if(calculator(two, left) < calculator(two, right)) {
                    sb.append("L");
                    left = two;
                    break;
                } else if(calculator(two, left) > calculator(two, right)) {
                    sb.append("R");
                    right = two;
                    break;
                } else {
                    if("right".equals(hand)) {
                        sb.append("R");
                        right = two;
                        break;
                    } else {
                        sb.append("L");
                        left = two;
                        break;
                    }
                }
            case 3 :
                sb.append("R");
                right[0] = 0; right[1] = 2;
                break;
            case 4 :
                sb.append("L");
                left[0] = 1; left[1] = 0;
                break;
            case 5 :
                int[] five = {1, 1};
                if(calculator(five, left) < calculator(five, right)) {
                    sb.append("L");
                    left = five;
                    break;
                } else if(calculator(five, left) > calculator(five, right)) {
                    sb.append("R");
                    right = five;
                    break;
                } else {
                    if("right".equals(hand)) {
                        sb.append("R");
                        right = five;
                        break;
                    } else {
                        sb.append("L");
                        left = five;
                        break;
                    }
                }
            case 6 :
                sb.append("R");
                right[0] = 1; right[1] = 2;
                break;
            case 7 :
                sb.append("L");
                left[0] = 2; left[1] = 0;
                break;
            case 8 :
                int[] eight = {2, 1};
                if(calculator(eight, left) < calculator(eight, right)) {
                    sb.append("L");
                    left = eight;
                    break;
                } else if(calculator(eight, left) > calculator(eight, right)) {
                    sb.append("R");
                    right = eight;
                    break;
                } else {
                    if("right".equals(hand)) {
                        sb.append("R");
                        right = eight;
                        break;
                    } else {
                        sb.append("L");
                        left = eight;
                        break;
                    }
                }
            case 9 :
                sb.append("R");
                right[0] = 2; right[1] = 2;
                break;
            case 0 :
                int[] zero = {3, 1};
                if(calculator(zero, left) < calculator(zero, right)) {
                    sb.append("L");
                    left = zero;
                    break;
                } else if(calculator(zero, left) > calculator(zero, right)) {
                    sb.append("R");
                    right = zero;
                    break;
                } else {
                    if("right".equals(hand)) {
                        sb.append("R");
                        right = zero;
                        break;
                    } else {
                        sb.append("L");
                        left = zero;
                        break;
                    }
                }
        }
    }

 

거리 계산 로직 : 주어진 숫자와 현재의 손가락 위치와의 거리를 계산한다.

public static int calculator(int[] number, int[] hand) {
    int distance = Math.abs(number[0] - hand[0]) + Math.abs(number[1] - hand[1]);
    return distance;
}

 

전체 코드

class Solution {
    
    static StringBuilder sb;
    static int[] right;
    static int[] left;
    
    public String solution(int[] numbers, String hand) {
        left = new int[]{3, 0};
        right = new int[]{3, 2};
        sb = new StringBuilder();
        for(int i = 0; i < numbers.length; i++) {
            int number = numbers[i];
            useHand(number, hand);
        }
        return sb.toString();
    }
    public static void useHand(int number, String hand) {
        switch (number) {
            case 1 :
                sb.append("L");
                left[0] = 0; left[1] = 0;
                break;
            case 2 :
                int[] two = {0, 1};
                if(calculator(two, left) < calculator(two, right)) {
                    sb.append("L");
                    left = two;
                    break;
                } else if(calculator(two, left) > calculator(two, right)) {
                    sb.append("R");
                    right = two;
                    break;
                } else {
                    if("right".equals(hand)) {
                        sb.append("R");
                        right = two;
                        break;
                    } else {
                        sb.append("L");
                        left = two;
                        break;
                    }
                }
            case 3 :
                sb.append("R");
                right[0] = 0; right[1] = 2;
                break;
            case 4 :
                sb.append("L");
                left[0] = 1; left[1] = 0;
                break;
            case 5 :
                int[] five = {1, 1};
                if(calculator(five, left) < calculator(five, right)) {
                    sb.append("L");
                    left = five;
                    break;
                } else if(calculator(five, left) > calculator(five, right)) {
                    sb.append("R");
                    right = five;
                    break;
                } else {
                    if("right".equals(hand)) {
                        sb.append("R");
                        right = five;
                        break;
                    } else {
                        sb.append("L");
                        left = five;
                        break;
                    }
                }
            case 6 :
                sb.append("R");
                right[0] = 1; right[1] = 2;
                break;
            case 7 :
                sb.append("L");
                left[0] = 2; left[1] = 0;
                break;
            case 8 :
                int[] eight = {2, 1};
                if(calculator(eight, left) < calculator(eight, right)) {
                    sb.append("L");
                    left = eight;
                    break;
                } else if(calculator(eight, left) > calculator(eight, right)) {
                    sb.append("R");
                    right = eight;
                    break;
                } else {
                    if("right".equals(hand)) {
                        sb.append("R");
                        right = eight;
                        break;
                    } else {
                        sb.append("L");
                        left = eight;
                        break;
                    }
                }
            case 9 :
                sb.append("R");
                right[0] = 2; right[1] = 2;
                break;
            case 0 :
                int[] zero = {3, 1};
                if(calculator(zero, left) < calculator(zero, right)) {
                    sb.append("L");
                    left = zero;
                    break;
                } else if(calculator(zero, left) > calculator(zero, right)) {
                    sb.append("R");
                    right = zero;
                    break;
                } else {
                    if("right".equals(hand)) {
                        sb.append("R");
                        right = zero;
                        break;
                    } else {
                        sb.append("L");
                        left = zero;
                        break;
                    }
                }
        }
    }

    public static int calculator(int[] number, int[] hand) {
        int distance = Math.abs(number[0] - hand[0]) + Math.abs(number[1] - hand[1]);
        return distance;
    }
}
728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.