방법 1) 각 키까지의 거리를 사전에 정의하기
def solution(numbers, hand):
# 각 키에서 0~9키 까지의거리(키:[각 번호까지의 거리])
key = {0: [0, 4, 3, 4, 3, 2, 3, 2, 1, 2],
1: [4, 0, 1, 2, 1, 2, 3, 2, 3, 4],
2: [3, 1, 0, 1, 2, 1, 2, 3, 2, 3],
3: [4, 2, 1, 0, 3, 2, 1, 4, 3, 2],
4: [3, 1, 2, 3, 0, 1, 2, 1, 2, 3],
5: [2, 2, 1, 2, 1, 0, 1, 2, 1, 2],
6: [3, 3, 2, 1, 2, 1, 0, 3, 2, 1],
7: [2, 2, 3, 4, 1, 2, 3, 0, 1, 2],
8: [1, 3, 2, 3, 2, 1, 2, 1, 0, 1],
9: [2, 4, 3, 2, 3, 2, 1, 2, 1, 0],
'*': [1, 3, 4, 5, 2, 3, 4, 1, 2, 3],
'#': [1, 5, 4, 3, 4, 3, 2, 3, 2, 1]
}
left, right = '*', '#'
result = ''
for i in numbers:
if i in [1, 4, 7]:
result += 'L'
left = i
elif i in [3, 6, 9]:
result += 'R'
right = i
else:
# 거리
ll = key[left][i]
rr = key[right][i]
if ll == rr:
if hand == 'right':
right = i
result += 'R'
else:
left = i
result += 'L'
elif ll < rr:
left = i
result += 'L'
else:
right = i
result +='R'
return result
현재 위치한 손가락에서부터 다음으로 눌러야 할 버튼까지의 거리를 구해 어떤 손가락으로 눌러야 할지 판단하는 문제이다.
매번 거리를 계산하는 것보다는 주어진 키패드가 0부터 9까지 10개뿐이기 때문에 미리 각 키에서의 거리를 계산해 두고 그때그때 필요한 값을 꺼내 쓰는 게 더 효율적일 것이라고 생각했다.
그래서 key라는 이름으로 딕셔너리를 키:[각 번호까지의 거리] 형태로 만든 다음, 각 키에서 0번까지의 거리를 0번 인덱스에, 1번까지의 거리를 1번 인덱스에... 9번까지의 거리를 9번 인덱스에 저장하였다.
1, 4, 7과 3, 6, 9일 때는 각각 왼손 오른손을 쓸 수 있게 해 주었고, 어떤 손을 사용했는지 result에 추가한 뒤 손가락의 위치 left, right를 갱신해 주는 방식으로 진행했다.
# 거리
ll = key[left][i]
rr = key[right][i]
2, 5, 8, 0일 때는 현재 left, right에서 눌러야 하는 키까지의 거리를 각각 ll, rr로 딕셔너리 key에서 찾은 다음 크기 비교를 통해 어떤 손을 사용할지 조건문으로 작성하였다.
방법 2) 각 키의 좌표를 이용해 거리 구하기
def solution(numbers, hand):
# 각 키의 좌표
key = {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],
0: [3, 1],
'*': [3, 0],
'#': [3, 2]
}
left, right = key['*'], key['#']
result = ''
for i in numbers:
if i in [1, 4, 7]:
result += 'L'
left = key[i]
elif i in [3, 6, 9]:
result += 'R'
right = key[i]
else:
# 거리
num = key[i]
ll = abs(left[0] - num[0]) + abs(left[1] - num[1])
rr = abs(right[0] - num[0]) + abs(right[1] - num[1])
if ll == rr:
if hand == 'left':
left = key[i]
result += 'L'
else:
right = key[i]
result += 'R'
elif ll < rr:
left = key[i]
result += 'L'
else:
right = key[i]
result += 'R'
return result
문제를 다 풀고 나서 다른 사람들의 코드를 보니 각 키별로 좌표 값을 저장하여 거리를 계산해 주는 방식의 코드가 많아서 이미 정답 처리가 되었지만 다양한 방식을 익혀보기 위해 코드를 작성해 보았다.
전체적인 과정은 유사하나 key를 정의하는 것과 거리를 구하는 부분이 조금 다르다.
1번 방법과 달리 2번 방법은 딕셔너리 key에 각 키의 좌표 값을 저장하였다.
각 키의 좌표를 오른쪽 그림에서 보이는 대로 [행, 열]을 형태로 저장하였다.
# 각 키의 좌표
key = {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],
0: [3, 1],
'*': [3, 0],
'#': [3, 2]
}
그렇기 때문에 각 손가락에서 눌러야 하는 키까지의 거리를 구할 때 x좌표는 x좌표끼리, y좌표는 y좌표끼리 연산해주어야 한다.
# 거리
num = key[i]
ll = abs(left[0] - num[0]) + abs(left[1] - num[1])
rr = abs(right[0] - num[0]) + abs(right[1] - num[1])
손가락의 위치와 눌러야 하는 키의 위치 중 어떤 값이 더 큰지 알 수 없기 때문에 절댓값을 구하는 abs() 함수를 사용하였다.