3 minute read



상세한 문제 내용은 여기에서 확인 바랍니다.

입출력 예시

Input-1
numbers = [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]
hand = “right”
Output-1
“LRLLLRLLRRL”

Input-2
numbers = [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]
hand = “left”
Output-2
“LRLLRRLLLRR”

Input-3
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
hand = “right”
Output-3
“LLRLLRLLRL”


문제 풀이

이 문제는 키패드를 누를 때 현재 누른 번호와 누를 번호와의 거리를 구하는 것이 핵심이다.

1
2
3
4
1 2 3
4 5 6
7 8 9
* 0 #

누를 키패드의 *, 0, #을 10, 11, 12로 두어야 거리를 구할 수 있다.

1
2
3
4
1  2  3
4  5  6
7  8  9
10 11 12

먼저 왼손은 *, 오른손은 #에서 시작한다고 하니, 왼손의 초기값은 10, 오른손의 초기값은 12로 초기화하자.

1
2
int L = 10;
int R = 12;

1,4,7은 왼손으로 누르고, 3,6,9 키패드는 오른손으로 누른다.
2,5,8,0 키패드는 더 가까운 손가락으로 누르기 때문에 전에 누른 번호와 누를 번호와 가까운 손가락으로 누를 수 있다.
0 키패드의 경우 앞에서 말한대로 거리를 구해야 하기에 11로 변경해야 한다.

누른 번호와 누를 번호와의 거리

그렇다면 누른 번호와 누를 번호와의 거리는 어떻게 구할까?

  • ((현재번호 - 누를번호)/3) + ((현재번호 - 누를번호)%3) 예를 들어 왼손이 4, 오른손이 2이고, 누를번호가 5일 경우를 들어보자.
1
2
3
4
L = 4, R = 2, number = 5

왼손 거리(leftDistance) = ((4-5)/3)+((4-5)%3) = 1
오른손 거리(RightDistance) = ((2-5)/3)+((2-5)%3) = 1

왼손 거리와 오른손 거리가 같을 경우엔 왼손잡이냐 오른손잡이에 따라 손가락을 누른다.
거리 구하는 식을 코드로 작성하면 아래와 같다.

1
2
int leftDistance = Math.abs(((L-num)/3)+((L-num)%3));
int rightDistance = Math.abs(((R-num)/3)+((R-num)%3));

거리 구하는 방법을 알아냈으니, 누를 번호와의 거리가 더 가까운(작은) 손의 손가락으로 누르면 된다.
위 과정을 코드로 작성해보자.

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
for(int num : numbers) {
    if(num==0) num = 11; 
    
    if(num==1 || num==4 || num==7) { // 1,4,7 키패드는 왼손으로 누른다.
        answer += "L";
        L=num;
    }
    else if(num==3 || num==6 || num==9) { // 3,6,9 키패드는 오른손으로 누른다.
        answer += "R";
        R=num;
    }
    else { // 2,5,8,0(11) 키패드를 누를 경우
        int leftDistance = Math.abs(((L-num)/3)+((L-num)%3));
        int rightDistance = Math.abs(((R-num)/3)+((R-num)%3));
        if(leftDistance>rightDistance) {
            answer += "R";
            R=num;
        }
        else if(rightDistance>leftDistance) {
            answer += "L"; 
            L=num;
        }
        else if(leftDistance==rightDistance && hand.equals("right")) {
            answer += "R"; 
            R=num;
        }
        else if(leftDistance==rightDistance && hand.equals("left")) {
            answer += "L"; 
            L=num;
        }
    }
}


작성 코드

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
class Solution {
    public static void main(String[] args) {
        int[] numbers = {1,3,4,5,8,2,1,4,5,5,9,5};
        // int[] numbers = {1,2,3,4,5,6,7,8,9,0};
        // int[] numbers = {7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2};
        // int[] numbers = {1, 2, 3, 3, 4, 4, 5, 5, 8, 8};
        String hand = "right";

        long start = System.currentTimeMillis();
        solution(numbers, hand);
        long end = System.currentTimeMillis();
        System.out.println("\n수행시간 = " + (end-start));
    }
    
    public static String solution(int[] numbers, String hand) {
        String answer = "";
        int L = 10;
        int R = 12;
        
        for(int num : numbers) {
            if(num==0) num = 11; 
            if(num==1 || num==4 || num==7) { // 1,4,7
                answer += "L";
                L=num;
            }
            else if(num==3 || num==6 || num==9) { // 3,6,9
                answer += "R";
                R=num;
            }
            else { // 2,5,8,0(11)
                int leftDistance = Math.abs(((L-num)/3)+((L-num)%3));
                int rightDistance = Math.abs(((R-num)/3)+((R-num)%3));
                if(leftDistance>rightDistance) {
                    answer += "R";
                    R=num;
                }
                else if(rightDistance>leftDistance) {
                    answer += "L"; 
                    L=num;
                }
                else if(leftDistance==rightDistance && hand.equals("right")) {
                    answer += "R"; 
                    R=num;
                }
                else if(leftDistance==rightDistance && hand.equals("left")) {
                    answer += "L"; 
                    L=num;
                }
            }
        }
        return answer;
    }
}

회고

  • 키패드의 번호들이 3으로 나눈 나머지가 각각 다르다는 아이디어를 통해 거리를 구하는 식을 생각해내는게 생각보다 어려웠다.
  • 왼손가락과 오른손가락의 초기값을 헷갈려 시간을 더 오래 쏟았다. 문제를 성급하게 읽어 넘어가지 않도록 해야겠다.