본문 바로가기
정리/알고리즘

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

by Hudini30 2022. 3. 25.

프로그래머스(코딩테스트 연습) - 키패드 누르기

해당 문제를 처음 풀때에는 키패드의 인덱스를 저장한 맵을 미리 선언한 후 해당 패드의 인덱스를 가져와 패드 인덱스를 3으로 나눈 몫과 나머지를 통해 왼손으로 패드를 누를지 오른손으로 패드를 누를지 결정하는 방식으로 풀었습니다.
키패드의 인덱스는 0 부터 시작해 11까지로 정해두고 현재 왼손의 위치 오른손의 위치는 각각 눌러야 하는 키패드의 인덱스를 3으로 나눈 나머지에 따라 0이면 왼손, 1이면 왼손/오른손중 결정(더 가까운 위치는 몫과 나머지를 x,y 좌표라 생각하고 키패드의 몫과 나머지를 각 손 위치의 몫과 나머지와 각각의 차이를 더함)하는 방식으로 풀었습니다.

 public String solution(int[] numbers, String hand) {
        StringBuilder answer = new StringBuilder();
        int currentLeftHand = 9;
        int currentRightHand = 11;
        for(int number : numbers) {
            int padIndex = number == 0 ? 10 : number - 1;
            int n = padIndex / 3;
            int mod = padIndex % 3;

            if (mod == 0) {
                answer.append("L");
                currentLeftHand = padIndex;
            } else if (mod == 1) {
                int leftHandLength = Math.abs(n - (currentLeftHand / 3)) + Math.abs(mod - (currentLeftHand % 3));
                int rightHandLength = Math.abs(n - (currentRightHand / 3)) + Math.abs(mod - (currentRightHand % 3));

                if (leftHandLength < rightHandLength) {
                    answer.append("L");
                    currentLeftHand = padIndex;
                } else if (leftHandLength > rightHandLength) {
                    answer.append("R");
                    currentRightHand = padIndex;
                } else if (hand.equals("right")){
                    answer.append("R");
                    currentRightHand = padIndex;
                } else {
                    answer.append("L");
                    currentLeftHand = padIndex;
                }

            } else {
                answer.append("R");
                currentRightHand = padIndex;
            }
        }

        return answer.toString();
    }

댓글