1, 4, 7 : 왼손
3, 6, 9 : 오른손
2, 5, 8 : 위치 및 손잡이로 판단
문제 이해하기 위해 먼저 예시를 보자!
ex) 1 3 4 5 8 2 1 4 5 9 5
- left, right는 행렬 위치
1인 경우 (4도 동일하다.)
- 왼손에 해당 숫자 이므로, left에 1의 행렬 위치 저장
3인 경우
- 오른손에 해당 숫자 이므로, right에 3의 행렬 위치 저장
5인 경우
가운데에 해당 숫자 이므로,
- 왼쪽과 오른쪽 중 가장 가까운 위치에 있는 손으로 버튼을 누른다.
- 같은 경우이면, 왼손 잡이 오른손 잡이로 판결난다.
현재는 4 와 3 중 4가 가까우므로 왼손으로 버튼을 누른다.
위 예시를 보면 경우의 수를 알 수 있다.
(가장 가까운 위치 : 두 좌표 x, y 차이 값으로 알 수 있다.)
그리고, 입력된 0 ~ 9
숫자로 2차원 배열 위치를 알 수 있다.
1은 0, 0
2는 0, 1
~
0은 3, 2
이럴 경우 딕셔너리를 사용하면 된다.
dist = {i: [] for i in range(0, 10)}
dist[0] = [3, 1]
cnt = 1
for i in range(3):
for j in range(3):
dist[cnt] = [i, j]
cnt += 1
def solution(numbers, hand):
answer = ''
dist = {i: [] for i in range(0, 10)}
dist[0] = [3, 1]
cnt = 1
for i in range(3):
for j in range(3):
dist[cnt] = [i, j]
cnt += 1
# 첫 시작 위치
cur_left = [3, 0]
cur_right = [3, 2]
for num in numbers:
if num in [1, 4, 7]:
# 왼쪽 좌표
cur_left = [dist[num][0], dist[num][1]]
answer += "L"
elif num in [3, 6, 9]:
# 오른쪽 좌표
cur_right = [dist[num][0], dist[num][1]]
answer += "R"
else:
# 가운데 있는 좌표
cur_left_len = abs(cur_left[0] - dist[num][0]) + abs(cur_left[1] - dist[num][1])
cur_right_len = abs(cur_right[0] - dist[num][0]) + abs(cur_right[1] - dist[num][1])
if cur_left_len == cur_right_len:
if hand == "right":
cur_right = [dist[num][0], dist[num][1]]
answer += "R"
else:
cur_left = [dist[num][0], dist[num][1]]
answer += "L"
else:
if cur_left_len > cur_right_len:
cur_right = [dist[num][0], dist[num][1]]
answer += "R"
else:
cur_left = [dist[num][0], dist[num][1]]
answer += "L"
return answer