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

윤준혁·2024년 3월 16일

나의 풀이

class Solution {
    public String solution(int[] numbers, String hand) {
        String answer = "";
        int currL = 10; // 1
        int currR = 12;
        
        for (int i = 0; i < numbers.length; i++) {
            int n = numbers[i];
            
            if (n == 1 || n == 4 || n == 7) { // 2
                currL = n;
                answer += "L";
            } else if (n == 3 || n == 6 || n == 9) { // 3
                currR = n;
                answer+= "R";
            } else { // 4
                if (n == 0) n = 11;
                
                int disL = (Math.abs(n - currL) / 3) + (Math.abs(n - currL) % 3);
                int disR = (Math.abs(n - currR) / 3) + (Math.abs(n - currR) % 3);
                
                if (disR < disL) { // 5
                    currR = n;
                    answer += "R";
                } else if (disL < disR) {
                    currL = n;
                    answer += "L";
                } else {
                    if (hand.equals("right")) { // 6
                        currR = n;
                        answer += "R";
                    } else {
                        currL = n;
                        answer += "L";
                    }
                }
            }
        }
        
        return answer;
    }
}

과정

  1. 키패드의 순서대로 번호를 붙인다(* = 10, 0 = 11, # = 12)
  2. numbers[i]가 1, 4, 7 중에 하나라면 왼손을 numbers[i]로 옮기고, answer에 L을 추가
  3. numbers[i]가 3, 6, 9중에 하나라면 오른손을 numbers[i]로 옮기고, answer에 R을 추가
  4. numbers[i]가 2, 5, 8, 0 중에 하나라면 왼손과 오른손의 목표지점까지의 거리를 잰다
  5. 거리가 더 가까운 쪽을 numbers[i]로 옮기고 해당하는 손을 answer에 추가
  6. 같다면 hand가 right면 R을 추가, left면 L을 추가

다른 사람 풀이

class Solution {
    //        0부터 9까지 좌표 {y,x}
    int[][] numpadPos = {
            {3,1}, //0
            {0,0}, //1
            {0,1}, //2
            {0,2}, //3
            {1,0}, //4
            {1,1}, //5
            {1,2}, //6
            {2,0}, //7
            {2,1}, //8
            {2,2}  //9
    };
    //초기 위치
    int[] leftPos = {3,0};
    int[] rightPos = {3,2};
    String hand;
    public String solution(int[] numbers, String hand) {
        this.hand = (hand.equals("right")) ? "R" : "L";

        String answer = "";
        for (int num : numbers) {
            String Umji = pushNumber(num);
            answer += Umji;

            if(Umji.equals("L")) {leftPos = numpadPos[num]; continue;}
            if(Umji.equals("R")) {rightPos = numpadPos[num]; continue;}
        }
        return answer;
    }

    //num버튼을 누를 때 어디 손을 사용하는가
    private String pushNumber(int num) {
        if(num==1 || num==4 || num==7) return "L";
        if(num==3 || num==6 || num==9) return "R";

        // 2,5,8,0 일때 어디 손가락이 가까운가
        if(getDist(leftPos, num) > getDist(rightPos, num)) return "R";
        if(getDist(leftPos, num) < getDist(rightPos, num)) return "L";

        //같으면 손잡이
        return this.hand;
    }

    //해당 위치와 번호 위치의 거리
    private int getDist(int[] pos, int num) {
        return Math.abs(pos[0]-numpadPos[num][0]) + Math.abs(pos[1]-numpadPos[num][1]);
    }
}
  • 키패드의 순서가 변하지 않으므로 고정시킨후 좌표로 찾는 방법도 나쁘지 않은 것 같다

0개의 댓글