코딩테스트 연습 - 키패드 누르기
키패드를 누르는 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 반환하라.
거리를 어떻게 구할 지가 문제다. 그냥 숫자끼리 빼는건 손가락이 가운데 있을 경우 오류가 발생한다.
def solution(numbers, hand):
answer = ''
left, right = 10, 12
for i in range(len(numbers)):
if numbers[i] == 1 or numbers[i] == 4 or numbers[i] == 7:
left = numbers[i]
answer += "L"
elif numbers[i] == 3 or numbers[i] == 6 or numbers[i] == 9:
right = numbers[i]
answer += "R"
# 가운데 2,5,8,0 누를 경우 가까운 손가락 / 거리가 같으면 주손가락
else:
if abs(left-numbers[i]) > abs(right-numbers[i]):
right = numbers[i]
answer += "R"
elif abs(left-numbers[i]) < abs(right-numbers[i]):
left = numbers[i]
answer += "L"
if abs(left-numbers[i]) == abs(right-numbers[i]):
if hand == "left":
left = numbers[i]
answer += "L"
else:
right = numbers[i]
answer += "R"
print(answer)
return answer
숫자랑 숫자를 빼지 않고 각 숫자를 좌표평면에 놓고 좌표를 설정하여 두 점 사이의 거리를 구했다.
합계: 60.0 / 100.0 : 테스트 13~20 실패
import math
def solution(numbers, hand):
answer = ''
left, right = (0,0), (2,0)
# 0~9의 좌표
location = [(1,0), (0,3), (1,3), (2,3), (0,2), (1,2), (2,2), (0,1), (1,1), (2,1)]
for i in range(len(numbers)):
if numbers[i] == 1 or numbers[i] == 4 or numbers[i] == 7:
left = location[numbers[i]]
answer += "L"
elif numbers[i] == 3 or numbers[i] == 6 or numbers[i] == 9:
right = location[numbers[i]]
answer += "R"
else:
l_distance = math.sqrt(math.pow(left[0]-location[numbers[i]][0], 2) +
math.pow(left[1]-location[numbers[i]][1], 2))
r_distance = math.sqrt(math.pow(right[0]-location[numbers[i]][0], 2) +
math.pow(right[1]-location[numbers[i]][1], 2))
if l_distance < r_distance:
left = location[numbers[i]]
answer += "L"
elif l_distance > r_distance:
right = location[numbers[i]]
answer += "R"
else:
if hand == "left":
left = location[numbers[i]]
answer += "L"
else:
right = location[numbers[i]]
answer += "R"
return answer
문제를 천천히 다시 읽어보니 두 점 사이의 거리를 구하는 문제인줄 알았지만 아니였다. 키패드에서의 이동은 상하좌우 한칸당 1이다. 그래서 좌표평면으로 대각선의 길이를 구하는 것이 아니라 (x좌표차)+(y좌표차)가 정답이다.
추가적으로 조건문에서 조건을 나열하는 것보다 리스트를 만들어 해당하는 숫자나 문자만 저장해 if ~ in ~ 을 사용하는 것이 깔끔한 것 같다.
def solution(numbers, hand):
answer = ''
left, right = (0,0), (2,0)
left_key = [1, 4, 7]
right_key = [3, 6, 9]
# 0~9의 좌표
location = [(1,0), (0,3), (1,3), (2,3), (0,2), (1,2), (2,2), (0,1), (1,1), (2,1)]
for i in range(len(numbers)):
if numbers[i] in left_key:
left = location[numbers[i]]
answer += "L"
elif numbers[i] in right_key:
right = location[numbers[i]]
answer += "R"
else:
l_distance = abs(left[0]-location[numbers[i]][0]) +
abs(left[1]-location[numbers[i]][1])
r_distance = abs(right[0]-location[numbers[i]][0]) +
abs(right[1]-location[numbers[i]][1])
if l_distance < r_distance:
left = location[numbers[i]]
answer += "L"
elif l_distance > r_distance:
right = location[numbers[i]]
answer += "R"
else:
if hand == "left":
left = location[numbers[i]]
answer += "L"
else:
right = location[numbers[i]]
answer += "R"
return answer