카테고리 없음

[2020 카카오 인턴십 / 프로그래머스] 키패드 누르기 for JAVA

냠냠:) 2020. 9. 11. 05:07

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

[문제 설명]

스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.

이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.

  1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
  2. 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
  3. 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
  4. 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
    4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.

[제한사항]

  • numbers 배열의 크기는 1 이상 1,000 이하입니다.
  • numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
  • hand는 "left" 또는 "right" 입니다.
    • "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
  • 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어 붙여 문자열 형태로 return 해주세요.

[풀이]

많은 좌표값과 좌표 상태에 따라 달라지는 값들이 더 이상 지겨워서..

키패드의 번호를 누를 때마다 다른 번호들 간의 거리 값이 달라지는 클래스를 만들었다.

 

개인적으로 저 if문 안에 있는 부분이 동작해야 맞는 것 같은데.... 실제 테케에서는 저부분이 있으면 틀립니다.

아무리 생각을 해봐도 두 번째 시작하는 if문 말고는(2,5,8,0중 차이가 2 이상 나는 2곳이 있을 수 없음)..어차피 바로 아래 else if로 넘어갈 텐데.. 이해가 안 된다. 

 

주석 처리한 곳 빼고 테케를 돌리면 잘 동작하니 써도 될 듯하다.

[코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
    public String solution(int[] numbers, String hand) {
        int handCheck = 0// 0, 왼손잡이, 1 오른손 잡이
        String answer = "";
        if (hand.equals("right")) {
            handCheck = 1;
        }
        ArrayList<Integer> leftSide = new ArrayList<Integer>();            //왼쪽포함된 곳
        ArrayList<Integer> rightSide = new ArrayList<Integer>();        //오른쪽에 포함된 곳
        ArrayList<Integer> centerSide = new ArrayList<Integer>();
        leftSide.add(1); leftSide.add(4);leftSide.add(7); 
        rightSide.add(3); rightSide.add(6); rightSide.add(9);
        centerSide.add(2); centerSide.add(5); centerSide.add(8); centerSide.add(0);
        
        Hands left = new Hands('L', handCheck, '*');
        Hands right = new Hands('R', handCheck, '#');
        
        if(leftSide.contains(numbers[0])) {                                //시작 부분 처리 로직
            left.setPos(numbers[0]); 
            answer += "L";
        }else if(rightSide.contains(numbers[0])) {
            right.setPos(numbers[0]); 
            answer += "R";
        }else {
            if(handCheck == 0) {
                left.setPos(numbers[0]); 
                answer += "L";
            }else {
                right.setPos(numbers[0]); 
                answer += "R";
            }
        }
        
        for(int i = 1; i < numbers.length; i++) {                                //하나의 번호에 대해서
            int pos = numbers[i];                                                //하나의 번호
            if(leftSide.contains(pos)) {                                        //1,4,7이면 왼손
                left.setPos(pos);
                answer +="L";
            }else if(rightSide.contains(pos)){                                    //3,6,9면 오른손
                right.setPos(pos);
                answer += "R";
            }else {                                                                //2,5,8,0이면 
                if(left.bais.get(pos) < right.bais.get(pos)) {                    //목표 번호와 왼손의 거리 차이가 더 적으면 
                    left.setPos(pos);
                    answer += "L";
                }else if(left.bais.get(pos) > right.bais.get(pos)) {            //목표 번호와 오른손의 거리의 차가 적으면
                    right.setPos(pos);
                    answer += "R";
                }else {                                                            //같다면
                    /*
                      if(left.bais.get(pos) > 1) {
                        if(centerSide.contains(left.presentPos) && centerSide.contains(right.presentPos)) {
                            if(handCheck == 0) {
                                left.setPos(pos);
                                answer+="L";
                                continue;
                            }else {
                                right.setPos(pos);
                                answer += "R";
                                continue;
                            }
                        }else if(centerSide.contains(left.presentPos)) {
                            right.setPos(pos);
                            answer += "R";
                            continue;
                        }else if(centerSide.contains(right.presentPos)) {
                            left.setPos(pos);
                            answer+="L";
                            continue;
                        }
                    }
                    */
                    if(handCheck == 0) {
                        left.setPos(pos);
                        answer+="L";
                    }else {
                        right.setPos(pos);
                        answer += "R";
                    }
                }
            }
        }
        return answer;
    }
 
    class Hands {
        char whichHand;
        int handCheck;
        int presentPos;
        Map<Integer,Integer> bais;
 
        public Hands(char whichHand, int handCheck, int presentPos) {
            this.whichHand = whichHand;
            this.handCheck = handCheck;
            this.presentPos = presentPos;
            this.bais = new HashMap<Integer, Integer>();        //시작부분 가중치 초기화 
            this.bais.put(24);
            this.bais.put(53);
            this.bais.put(82);
            this.bais.put(01);                                //가까운게 값이 작음
            
        }
 
        public void setPos(int presentPos) {                    //손을 움직일 때마다 다른 번호들간의 값들이 자동으로 변함
            this.presentPos = presentPos;
            if (presentPos == 1 || presentPos == 3) {
                bais.put(21); bais.put(52); bais.put(83); bais.put(0,4);
                return;
            }
            if (presentPos == 4 || presentPos == 6) {
                bais.put(22); bais.put(51); bais.put(82); bais.put(0,3);
                return;
            }
            if (presentPos == 7 || presentPos == 9) {
                bais.put(23); bais.put(52); bais.put(81); bais.put(0,2);
                return;
            }
            if (presentPos == 2) {
                bais.put(20); bais.put(51); bais.put(82); bais.put(0,3);
                return;
            }
            if (presentPos == 5) {
                bais.put(21); bais.put(50); bais.put(81); bais.put(0,2);
                return;
            }
            if (presentPos == 8) {
                bais.put(22); bais.put(51); bais.put(80); bais.put(0,1);
                return;
            }
            if (presentPos == 0) {
                bais.put(23); bais.put(52); bais.put(81); bais.put(0,0);
                return;
            }
 
        }
    }
cs

테스트 케이스 통과

느낀 점: 실제로 2020 카카오 인턴십을 볼 때 봤던 문제인데 그때는 급해서 빠르게 풀었지만 이번에는 클래스도 선언하고 재밌게 풀었던 것 같다.

반응형