https://programmers.co.kr/learn/courses/30/lessons/67256
휴대폰 숫자 패드에서 숫자 버튼과 버튼의 거리를 구하는 것이 핵심인 문제이다.
많은 고민을 하다가 다른 사람의 풀이를 참고하며 풀어보았다.
핵심은 가운데 열의 버튼들이다. 가운데 버튼을 누를 때에는 더 가까운 쪽의 손으로 클릭해야 하기 때문이다.
가운데 열의 버튼을 기준으로
한 칸 차이는 절대값 1 or 3
두 칸 차이는 절대값 2 or 4
세 칸 차이는 절대값 5 or 7 이다.
-7 -3 -5
-4 ↖ ↑ ↗ -2
-1 ← → +1
+2 ↙ ↓ ↘ +4
+5 +3 +7
이는 숫자 버튼끼리의 거리차이 절대값//3 의 (몫) + 거리 차이 절대값 %3 (나누기)의 합 = 거리
라는 공식을 만들어 낼 수 있다.
이를 활용한 코드는 아래와 같다.
def solution(numbers, hand): answer = '' l_hand = 10 r_hand = 12 for num in numbers: if num == 1 or num == 4 or num == 7: #왼손 l_hand = num answer += "L" elif num == 3 or num == 6 or num == 9: #오른손 r_hand = num answer += "R" else: if num == 0: num = 11 left_point = abs(num - l_hand) right_point = abs(num - r_hand) left_distance = sum(list(map(int, [left_point//3, left_point%3]))) right_distance = sum(list(map(int, [right_point//3, right_point%3]))) if left_distance == right_distance: # 거리 같은 때 -> 주 손 if hand == "left": l_hand = num answer += "L" else: r_hand = num answer += "R" else: # 거리 다를 때 -> 가까운 손 if left_distance < right_distance: l_hand = num answer += "L" else: r_hand = num answer += "R" return answer
두 번째 방법은 각 키패드 별로 임의의 좌표를 설정해 준 후에 좌표간의 거리를 구하는 방법이다.
key라는 딕셔너리에 튜플 형태로 좌표를 설정 해준다. (리스트로 설정해도 무방) 튜플을 사용하는 이유는 보통 튜플은 원소의 타입이 같을 때, 그리고 immutable 한 값을 초기화할 때 사용하기 때문이다.
또한, 왼손과 오른 손의 디폴트 좌표를 10과 12로 설정 하였는데, "*", "#"로 사용해도 무관하다.
거리를 구하는 방식은 맨하탄 거리 계산법을 사용하였다. 좌, 우, 상, 하를 각각 1로 사용하기 때문에 유클리드 거리 계산법을 사용하면 문제를 풀 수 없다.
def solution(numbers, hand): answer = '' l_hand = 10 r_hand = 12 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), 10 : (3, 0), 0 : (3, 1), 12 : (3,2) } for num in numbers: if num == 1 or num == 4 or num == 7: l_hand = num answer += "L" elif num == 3 or num == 6 or num == 9: r_hand = num answer += "R" else: left_distance = abs(key[num][0] - key[l_hand][0]) + abs(key[num][1] - key[l_hand][1]) right_distance = abs(key[num][0] - key[r_hand][0]) + abs(key[num][1] - key[r_hand][1]) if left_distance == right_distance: if hand == "left": l_hand = num answer += "L" else: r_hand = num answer += "R" else: if left_distance < right_distance: l_hand = num answer += "L" else: r_hand = num answer += "R" return answer