스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
numbers | hand | return |
---|---|---|
[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" |
def solution(numbers, hand):
left_side = (1,4,7) #이 숫자들은 무조건 왼손
right_side = (3,6,9) #이 숫자들은 무조건 오른손
left_pointer = '*' #왼손 마지막 위치
right_pointer = '#' #오른손 마지막 위치
#번호에 따른 좌표값(x축,y축)
matrix = {'*':(0,0), 0:(1,0), '#':(2,0), 7:(0,1), 8:(1,1), 9:(2,1),
4:(0,2), 5:(1,2), 6:(2,2), 1:(0,3), 2:(1,3), 3:(2,3)}
result = ''
for v in numbers:
if v in left_side:
left_pointer = v
result += 'L'
elif v in right_side:
right_pointer = v
result += 'R'
else:
place = matrix[v]
left = matrix[left_pointer]
right = matrix[right_pointer]
left_to_place_distance = abs(place[0]-left[0]) + abs(place[1]-left[1])
right_to_place_distance = abs(place[0]-right[0]) + abs(place[1]-right[1])
if left_to_place_distance > right_to_place_distance:
right_pointer = v
result += 'R'
elif left_to_place_distance < right_to_place_distance:
left_pointer = v
result += 'L'
else:
if hand == 'left':
left_pointer = v
result += 'L'
else:
right_pointer = v
result += 'R'
return result
1,4,7
은 무조건 왼손 / 3,6,9
는 무조건 오른손으로 누르는 숫자들입니다. 조건문을 통해 이 두 가지 경우에는 무조건 L아니면 R을 넣어줍니다. 마지막 위치정보를 저장합니다.
2,5,0,8
은 왼손과 오른손의 마지막 위치정보와 현재 번호의 좌표간에 거리계산을 통해 판별해야합니다.
뺄셈을 수행했을 때 -1이 나오더라도 1만큼 거리차이가 나는 것이므로 절대값으로 계산을 해줍니다. x축 y축의 차이를 더한 값이 right_to_place_distance(오른손의 현재좌표와 현재번호 좌표의 위치)이 더 크다면 왼손, 반대인 경우엔 오른손이므로 각각 더해주고, 위치정보를 저장합니다.
양쪽 손의 위치좌표와 현재 번호의 위치좌표가 같은 경우는 문제의 조건처럼 left인지 right인지 판별해서 마찬가지로 더해주고, 위치정보를 저장합니다.
후기: 추천수가 가장 높은 모범답안이 저와 매우매우 유사해서 놀랐습니다. 풀이는 그럭저럭했는데 중간에 딕셔너리에서 좌표하나를 잘 못 넣어서 삽질을 꽤 오래했습니다...가끔은 로직이 아니라 제 손가락이 문제인 것 같습니다.