def get_dist(cur_pos, num):
cur_row, cur_col = (cur_pos-1)//3, (cur_pos-1)%3
target_row, target_col = (num-1) //3, (num-1) % 3
return abs(cur_row - target_row) + abs(cur_col - target_col)
def solution(numbers, hand):
answer = ''
cur_left, cur_right = 10, 12
for num in numbers:
if num == 0:
num = 11
if num % 3 == 1: # 왼쪽 열
cur_left = num
answer += 'L'
elif num % 3 == 0: # 오른쪽 열
cur_right = num
answer += 'R'
else: # 2, 5, 8, 0 경우의 수
dist_from_left = get_dist(cur_left, num)
dist_from_right = get_dist(cur_right, num)
if dist_from_left < dist_from_right: #왼쪽 손이 더 가까운 경우
cur_left = num
answer += 'L'
elif dist_from_left > dist_from_right: #오른쪽 손이 더 가까운 경우
cur_right = num
answer += 'R'
else: # 거리가 같은 경우 어느 손잡이인지 따진다
if hand == "right":
cur_right = num
answer += 'R'
else:
cur_left = num
answer += 'L'
return answer
*은 10으로 0은 11로 #은 12로 치환해서 풀었다. 그러면 해당 숫자에서 //3을 하면 행의 위치가 나오고, (해당 숫자 -1) % 3을 하면 열의 위치가 나온다.
def solution(numbers, hand):
answer = ''
key_dict = {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)}
left = [1,4,7]
right = [3,6,9]
lhand = '*'
rhand = '#'
for i in numbers:
if i in left:
answer += 'L'
lhand = i
elif i in right:
answer += 'R'
rhand = i
else:
curPos = key_dict[i]
lPos = key_dict[lhand]
rPos = key_dict[rhand]
ldist = abs(curPos[0]-lPos[0]) + abs(curPos[1]-lPos[1])
rdist = abs(curPos[0]-rPos[0]) + abs(curPos[1]-rPos[1])
if ldist < rdist:
answer += 'L'
lhand = i
elif ldist > rdist:
answer += 'R'
rhand = i
else:
if hand == 'left':
answer += 'L'
lhand = i
else:
answer += 'R'
rhand = i
return answer
비슷하지만 각 숫자의 행과 열의 위치를 미리 계산해서 dict로 저장함으로서 *, 0, #을 치환하는 과정이 없어졌다.