스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
numbers hand result
[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"
입출력 예 #1
순서대로 눌러야 할 번호가 [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]이고, 오른손잡이입니다.
왼손 위치 오른손 위치 눌러야 할 숫자 사용한 손 설명
* # 1 L 1은 왼손으로 누릅니다.
1 # 3 R 3은 오른손으로 누릅니다.
1 3 4 L 4는 왼손으로 누릅니다.
4 3 5 L 왼손 거리는 1, 오른손 거리는 2이므로 왼손으로 5를 누릅니다.
5 3 8 L 왼손 거리는 1, 오른손 거리는 3이므로 왼손으로 8을 누릅니다.
8 3 2 R 왼손 거리는 2, 오른손 거리는 1이므로 오른손으로 2를 누릅니다.
8 2 1 L 1은 왼손으로 누릅니다.
1 2 4 L 4는 왼손으로 누릅니다.
4 2 5 R 왼손 거리와 오른손 거리가 1로 같으므로, 오른손으로 5를 누릅니다.
4 5 9 R 9는 오른손으로 누릅니다.
4 9 5 L 왼손 거리는 1, 오른손 거리는 2이므로 왼손으로 5를 누릅니다.
5 9 - -
따라서 "LRLLLRLLRRL"를 return 합니다.
입출력 예 #2
왼손잡이가 [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]를 순서대로 누르면 사용한 손은 "LRLLRRLLLRR"이 됩니다.
입출력 예 #3
오른손잡이가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]를 순서대로 누르면 사용한 손은 "LLRLLRLLRL"이 됩니다.
우선 손가락의 위치를 각각 저장할 변수 left, right를 선언하고 *와 #를 표현하기 위해 문자열로 numbers의 각 자릿수들을 처리하도록 했다. numbers를 deque로 변환하여 popleft()를 사용하여 성능을 높였다. 왼손의 범위의 수나 오른손의 범위의 수가 나오면 left, right를 갱신시켜주고 만약 가운데 수 (2, 5, 8, 0)이 나오면 좌표간의 거리를 계산하는 함수를 작성하고 사용하여 어떤 손가락으로 누를지를 결정하도록 하였다.
from collections import deque
def solution(numbers, hand):
answer = ''
dn=deque(numbers)
l=['1', '4', '7']
r=['3', '6', '9']
left, right = '*', '#'
def distance(cur, left_l, right_l):
pad=[['1','2','3'], ['4','5','6'],['7','8','9'],['*', '0', '#']]
cur_x, cur_y, left_x, left_y, right_x, right_y = 0, 0, 0, 0, 0, 0
for i in range(4):
if pad[i].count(cur)==1:
cur_x, cur_y = i, pad[i].index(cur)
if pad[i].count(left_l)==1:
left_x, left_y = i, pad[i].index(left_l)
if pad[i].count(right_l)==1:
right_x, right_y = i, pad[i].index(right_l)
left_dis=abs(left_x-cur_x)+abs(left_y-cur_y)
right_dis=abs(right_x-cur_x)+abs(right_y-cur_y)
if left_dis<right_dis:
return 'L'
elif left_dis>right_dis:
return 'R'
else:
if hand=='left':
return 'L'
else:
return 'R'
while dn:
tmp=str(dn.popleft())
if tmp in l:
answer+='L'
left=tmp
elif tmp in r:
answer+='R'
right=tmp
else:
answer+=distance(tmp, left, right)
if answer[-1]=='L':
left=tmp
else:
right=tmp
return answer