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

Lv1 문제이며, 주어진 순서대로 키패드를 움직일 때 왼손 오른손 패턴 순을 리턴하는 함수를 구현하는 문제입니다.

유의 사항으로 맨 처음 왼손, 오른손 엄지손가락 시작위치를 잘 설정해야 하고, 이 부분만 통과하면 무리 없이 통과 가능합니다.

 

구현 방법으로는 맨처음 왼손 엄지손가락 기준 0~9까지 초기 거리, 오른손 엄지손가락 기준 0~9까지 초기 거리, 0~9까지의 서로 간 거리를 배열로 미리 선언해서 거리를 비교하는 방식으로 구현하였고, 이럼에도 불구하고 손가락 거리가 같은 경우에는 왼손잡이 혹은 오른손잡이 여부를 체크해서 이동하도록 하였습니다. 이동할 때마다 손가락 인덱스를 체크하는 것 또한 필수입니다.

 

예제 코드는 다음과 같습니다.

 

    public static String solution(int[] numbers, String hand) {
        StringBuilder sb = new StringBuilder();
        int leftIndex = -1;
        int rightIndex = -1;
        int[][] dis = {{0,4,3,4,3,2,3,2,1,2},{4,0,1,2,1,2,3,2,3,4},{3,1,0,1,2,1,2,3,2,3},
                {4,2,1,0,3,2,1,4,3,2},{3,1,2,3,0,1,2,1,2,3},{2,2,1,2,1,0,1,2,1,2},{3,3,2,1,2,1,0,3,2,1},
                {2,2,3,4,1,2,3,0,1,2},{1,3,2,3,2,1,2,1,0,1},{2,4,3,2,3,2,1,2,1,0}};
        int[] leftDisArr = {1,3,4,5,2,3,4,1,2,3};
        int[] rightDisArr = {1,5,4,3,4,3,2,3,2,1};

        for (int num : numbers) {
            if (num % 3 == 1) {
                sb.append("L");
                leftIndex = num;
            } else if (num % 3 == 0 && num > 0) {
                sb.append("R");
                rightIndex = num;
            } else {
                int leftDis = leftIndex == -1 ? leftDisArr[num] : dis[leftIndex][num];
                int rightDis = rightIndex == -1 ? rightDisArr[num] : dis[rightIndex][num];
                if (leftDis < rightDis) {
                    sb.append("L");
                    leftIndex = num;
                } else if (leftDis > rightDis) {
                    sb.append("R");
                    rightIndex = num;
                } else {
                    sb.append("left".equals(hand) ? "L" : "R");
                    if ("left".equals(hand)) leftIndex = num;
                    else rightIndex = num;
                }
            }
        }
        return sb.toString();
    }

+ Recent posts