회고
이번 문제풀이는 상당히 시간이 걸렸다.
문제풀이에 있어서 어떻게 접근해야 할지 생각을 해 보았으나 좀처럼 감이 잡히지 않았다.
무엇보다도, 두 요소 사이의 거리를 구하는 문제의 경우 간단해 보이나 내가 제일 싫어하는 문제 유형이었다.
눈으로 보이는데로 한칸 움직이고, 한칸 움직인다는 식으로 코드를 구현하면 될텐데 그게 어려웠다.
우선적으로 생각해야되는 것이 각 키패드를 나타내는 데이터를 어떻게 구현할 것인가 이다. 이차원배열을 이용해서 각 좌표를 저장하는 식으로 데이터를 저장할지 아니면, 다른 방법이 있을지 한참을 생각한 결과 아래와 같은 코드로 구현하게 되었다.
이번 문제에서 알게 된점은 거리를 구하는 문제풀이의 경우는 각 데이터를 좌표를 가진 형태로 저장하고 문제풀이를 하면 쉽게 코드를 구현할 수 있다는 점이었다.
풀이
https://school.programmers.co.kr/learn/courses/30/lessons/67256
def distance(curr_pos, target_pos):
return abs(curr_pos[0]-target_pos[0])+ abs(curr_pos[1]-target_pos[1])
def solution(numbers, hand):
pad_pos = {
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)
}
result = []
left_hand_pos = pad_pos["*"]
right_hand_pos = pad_pos["#"]
for i in numbers:
if i in [1,4,7,"*"]:
result.append("L")
left_hand_pos = pad_pos[i]
elif i in [3,6,9,"#"]:
result.append("R")
right_hand_pos = pad_pos[i]
else:
left = distance(left_hand_pos, pad_pos[i])
right = distance(right_hand_pos, pad_pos[i])
if left == right:
if hand == "right":
result.append("R")
right_hand_pos = pad_pos[i]
else:
result.append("L")
left_hand_pos = pad_pos[i]
elif left > right:
result.append("R")
right_hand_pos = pad_pos[i]
elif right > left:
result.append("L")
left_hand_pos = pad_pos[i]
return "".join(result)
numbers = [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]
hand = "right"
solution(numbers, hand)
distance()라는 함수를 새로 정의해서 target이되는 키패드의 위치와 현재 오른쪽손의 위치, 왼쪽손의 위치를 각각 넘겨줘서 거리를 리턴하게 했다.
거리가 같은 경우는 매개변수로 받은 hand가 right/left에 따라서 결과값이 다르게 되고, 그렇지 않은 경우는 거리가 짧은 손을 결과값에 반영했다.