[프로그래머스] Lv1 키패드 누르기

do yeon kim·2022년 9월 21일
0
회고

이번 문제풀이는 상당히 시간이 걸렸다.
문제풀이에 있어서 어떻게 접근해야 할지 생각을 해 보았으나 좀처럼 감이 잡히지 않았다.

무엇보다도, 두 요소 사이의 거리를 구하는 문제의 경우 간단해 보이나 내가 제일 싫어하는 문제 유형이었다.

눈으로 보이는데로 한칸 움직이고, 한칸 움직인다는 식으로 코드를 구현하면 될텐데 그게 어려웠다.

우선적으로 생각해야되는 것이 각 키패드를 나타내는 데이터를 어떻게 구현할 것인가 이다. 이차원배열을 이용해서 각 좌표를 저장하는 식으로 데이터를 저장할지 아니면, 다른 방법이 있을지 한참을 생각한 결과 아래와 같은 코드로 구현하게 되었다.

이번 문제에서 알게 된점은 거리를 구하는 문제풀이의 경우는 각 데이터를 좌표를 가진 형태로 저장하고 문제풀이를 하면 쉽게 코드를 구현할 수 있다는 점이었다.

풀이

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에 따라서 결과값이 다르게 되고, 그렇지 않은 경우는 거리가 짧은 손을 결과값에 반영했다.

0개의 댓글