본문 바로가기

PS/프로그래머스

[프로그래머스-Level 1] 키패드 누르기_파이썬 ❌⭕

programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr


def get_distance(start, arrive, dic):
    distance = 0
    for x, y in zip(dic[start], dic[arrive]):
        distance += abs(x-y)
    
    return distance

def solution(numbers, hand):
    dic = {
        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]
    }
    left, right = '*', '#'
    
    result = ''
    for number in numbers:
        if str(number) in '147':
            left = number
            result += 'L'
        elif str(number) in '369':
            right = number
            result += 'R'
        else:
            left_distance = get_distance(left, number, dic)
            right_distance = get_distance(right, number, dic)
            
            if left_distance < right_distance:
                left = number
                result += 'L'
            elif left_distance > right_distance:
                right = number
                result += 'R'
            else:
                if hand == 'left':
                    left = number
                    result += 'L'
                else:
                    right = number
                    result += 'R'
            
    return result

키패드 사이의 거리를 구하는 방법을 생각해내지 못해, 결국 도움을 받아 풀었다. 

거리를 구하는 방법은 생각보다 간단하다. 출발점 좌표를 [x1, y1] 도착점 좌표를 [x2, y2] 라고 했을 때, abs(x1-x2) + abs(y1 - y2) 가 거리가 된다. 위 풀이에서는 zip을 활용했다.