파이썬 알고리즘 : 키패드 누르기

조건문

2024년 1월 19일 알고리즘 문제풀이

문제

난이도

Lv.1

코드

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
def solution(numbers, hand):
    arr = [0 for _ in range(len(numbers))]
    position = [[3,1],[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2],[3,0],False,[3,2]]
    finger = [10,12]
    left = [1,4,7]
    right = [3,6,9]
    for i in range(len(numbers)):
        num = numbers[i]
        if num in left:
            arr[i] = 'L'
            finger[0] = num
        elif num in right:
            arr[i] = 'R'
            finger[1] = num
        else:
            number_position = position[num]
            left_finger = position[finger[0]]
            right_finger = position[finger[1]]
            distance_left = abs(number_position[0]-left_finger[0]) + abs(number_position[1]-left_finger[1])
            distance_right = abs(number_position[0]-right_finger[0]) + abs(number_position[1]-right_finger[1])
            if distance_left < distance_right:
                arr[i] = 'L'
                finger[0] = num
            elif distance_left > distance_right:
                arr[i] = 'R'
                finger[1] = num
            else:
                if hand == 'left':
                    arr[i] = 'L'
                    finger[0] = num
                else:
                    arr[i] = 'R'
                    finger[1] = num
    answer = "".join(arr)
    return answer

각 번호간의 거리를 어떻게 처리할지 고민하다가 키패드를 좌표라고 생각하고 각 숫자의 위치를 값으로 갖는 배열 position을 만들었다.

finger는 현재 엄지 손가락의 위치를 나타내는 배열로 0번 index의 값은 왼손가락의 위치, 1번 index는 오른손가락의 위치이다.

번호가 특정 손으로 눌러야 한다면 결과(arr)에 추가한 후 현재 손가락의 위치만 업데이트 해주었다. 만약 가운데 줄에 위치하는 숫자(2,5,8,0) 중 하나라면 각 거리를 계산했다. 거리마저 똑같다면 문제에서 말한대로 hand에 따라 선택하도록 했다. 별(“*“)과 샵(“#”)은 숫자 10,11로 두었다. 숫자 0은 가장 작은 수긴 하지만, 좌표가 10의 위치이기 때문에 position 배열의 가장 처음에 온다.