문제:

풀이방법:

규칙 중 4를 구현하는 것이 핵심인 문제다.

 solution함수는 1,4,7 입력이 들어온다면 왼쪽 엄지손가락을 사용하고, 해당 번호로 left를 이동시키고, 3,6,9가 들어온다면 오른쪽 엄지손가락을 사용하고 right를 이동시킨다. 이제 2,5,8,0이 들어오는 경우 leftDistance와 rightDistance를 사용해서 거리를 계산한다. 더 작은 쪽의 엄지손가락으로 이동을 하고, 만약 같다면 hand의 우선순위에 따라 움직이도록 한다.

 leftDistance는 입력을 해야하는 숫자가 2,5,8,0일 때, 왼쪽 엄지손가락과 거리를 계산하는 함수다.

만약 이전 왼쪽 엄지 손가락이 2,5,8이고 입력해야 할 숫자가 0이라면 각 케이스마다 거리를 return 하게 만들고, 나머지는 두 수의 차를 3으로 나눈 몫을 반환하도록 한다. 왼쪽 엄지 손가락이 1,4,7에 있다면 이를 가운데 키패드로 옮겨주고 leftDistance로 재귀적으로 거리를 계산하도록 만든다. 이제 나머지 케이스인 0에 있거나, 초기 상태인 *에 있던 경우에 대해서만 거리를 계산해주면 된다.

 rightDistance로 leftDistance와 비슷하게 계산을 하도록 한다.

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
def leftDistance(num,left):
    if left in [2,5,8]:
        if num == 0:
            if left ==2:
                return 3
            elif left == 5:
                return 2
            else:
                return 1
        return abs(left-num)//3
    elif left in [1,4,7]:
        return leftDistance(num,left+1)+1
    else:
        if left == -1:
            if num == 2:
                return 4
            elif num == 5:
                return 3
            elif num == 8:
                return 2
            else:
                return 1
        if num == 0:
            return 0
        elif num == 8:
            return 1
        elif num == 5:
            return 2
        else:
            return 3
        
def rightDistance(num,right):
    if right in [2,5,8]:
        if num == 0:
            if right ==2:
                return 3
            elif right == 5:
                return 2
            else:
                return 1
        return abs(right-num)//3
    elif right in [3,6,9]:
        return rightDistance(num,right-1)+1
    else:
        if right == -1:
            if num == 2:
                return 4
            elif num == 5:
                return 3
            elif num == 8:
                return 2
            else:
                return 1
        if num == 0:
            return 0
        elif num == 8:
            return 1
        elif num == 5:
            return 2
        else:
            return 3
def solution(numbers,hand):
    answer = ""
    left, right = -1-1
    for num in numbers:
        if num in [1,4,7]:
            left = num
            answer += "L"
        elif num in [3,6,9]:
            right = num
            answer += "R"
        else:
            center_l = leftDistance(num,left)
            center_r = rightDistance(num,right)
            distance = center_l-center_r
            if distance > 0:
                right = num
                answer += "R"
            elif distance < 0:
                left = num
                answer += "L"
            else:
                if hand =="right":
                    right = num
                    answer+= "R"
                else:
                    left = num
                    answer += "L"
    return answer
cs

문제링크:

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

 

'Algorithm > Python' 카테고리의 다른 글

[BOJ]2164. 카드2  (0) 2020.07.14
[Programmers]2020 카카오 인턴십. 수식 최대화  (0) 2020.07.09
[BOJ]1543. 문서 검색  (0) 2020.07.02
[BOJ]5525. IOIOI  (0) 2020.06.30
[BOJ]11652. 카드  (0) 2020.06.25

+ Recent posts