[프로그래머스] [카카오 인턴] 키패드 누르기Lv.1
나의 풀이
def solution(numbers, hand):
keypad = {
1: [0, 0],
2: [0, 1],
3: [0, 2],
4: [1, 0],
5: [1, 1],
6: [1, 2],
7: [2, 0],
8: [2, 1],
9: [2, 2],
'*': [3, 0],
0: [3, 1],
'#': [3, 2],
}
result = []
left, right = keypad['*'], keypad['#']
for num in numbers:
if num == 3 or num == 6 or num == 9:
right = keypad[num]
result.append("R")
elif num == 1 or num == 4 or num == 7:
left = keypad[num]
result.append("L")
if num == 8 or num == 5 or num == 2 or num == 0:
num_x, num_y = keypad[num][0], keypad[num][1]
left_distance = (abs(num_x - left[0]) + abs(num_y - left[1]))
right_distance = (abs(num_x - right[0]) + abs(num_y - right[1]))
if right_distance > left_distance:
left = keypad[num]
result.append("L")
elif right_distance < left_distance:
right = keypad[num]
result.append("R")
else:
if hand == "left":
left = keypad[num]
result.append("L")
else:
right = keypad[num]
result.append("R")
return "".join(result)
- 입력되는 키패드의 번호에 맞는 좌표를 얻기위해 사전형을 사용했다.
- 처음 left, right 의 위치는 *과 #에 위치하기 때문에, 해당 좌표를 각 변수에 저장한다.
- 입력되는 숫자가 3, 6, 9이면 right 의 위치가 움직여야하기 때문에, right의 좌표를 숫자에 맞게 바꾸고, R을 결과에 추가한다.
- 입력되는 숫자가 1, 4, 7이면 right와 마찬가지로, left 의 좌표를 바꾸고 L을 결과에 추가한다.
- 만약 2, 5, 8, 0 과 같이 가운데에 있는 숫자라면, 현재 left, right 의 위치와의 거리를 계산하여 가까운 쪽을 움직인다.
- 단, 거리의 차가 같을 경우, 입력된 손의 위치에 맞는 손의 방향을 옮겨주고 결과에 추가해주면 된다.
- 마지막으로 결과는 문자열이어야 하기 때문에, join으로 리스트를 문자열로 바꿔준다.