https://programmers.co.kr/learn/courses/30/lessons/67256
'''
1. 아이디어
빈 리스트 안에 각 번호에 해당하는 인덱스 값을 기록해 놓는다.
그 다음에는 숫자 키패드를 입력할려고 할때마다 숫자 키패드와 현재 왼쪽 손과
오른쪽 손이 있는 위치와의 거리를 구한다음 계속 비교해서 거리가 가까운 손가락을 움직인다.
(움직이면 움직인 손가락(왼쪽 or 오른쪽)의 위치를 계속 갱신해준다.)
2. 시간복잡도
for문안에 대소비교 연산자 밖에 없으므로 O(N)일 것으로 추측된다.
'''
def solution(numbers, hand):
result = ''
# 키패드에 대한 좌표를 기록한다. [ 0:(3, 1) , 1:(0, 0) ~ *:(3, 0) , #:(3,2) ]
dis = [ (3, 1), (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2), (3, 0), (3, 2) ]
# 현재 왼쪽 손가락과 오른쪽 손가락의 위치를 저장한다.
now_lefthand, now_righthand = 10, 11
for num in numbers:
if num in (1, 4, 7): # 1, 4, 7에 해당하는 키패드는 왼쪽 손가락으로 클릭한다.
result += 'L'
now_lefthand = num
elif num in (3, 6, 9): # 3, 6, 9에 해당하는 키패드는 오른쪽 손가락으로 클릭한다.
result += 'R'
now_righthand = num
else: # 2, 4, 8, 0의 경우는 키패드와 현재 왼쪽손가락, 오른쪽 손가락과의 거리를 계산해서 비교한다.
dis_lefthand = abs((dis[now_lefthand][0] - dis[num][0])) + abs((dis[now_lefthand][1] - dis[num][1]))
dis_righthand = abs((dis[now_righthand][0] - dis[num][0])) + abs((dis[now_righthand][1] - dis[num][1]))
if dis_lefthand < dis_righthand: # 현재 키패드에 왼쪽 손가락이 가까운 경우
result += 'L'
now_lefthand = num
elif dis_lefthand > dis_righthand: # 현재 키패드에 오른쪽 손가락이 가까운 경우
result += 'R'
now_righthand = num
else: # 현재 키패드와 왼쪽, 오른쪽 손가락 간의 거리가 같다면 인자로 받은 hand의 값으로 판별한다.
if hand == 'left':
result += 'L'
now_lefthand = num
else:
result += 'R'
now_righthand = num
return result
같은 문제라도 다양하게 풀어보려는 노력을 해야겠다.