[프로그래머스] 2020 카카오 인턴 키패드누르기 in Python

박준규·2021년 12월 28일
0

알고리즘

목록 보기
7/39

키패드 누르기 풀러가기!

난이도: lv 1

문제는 그렇게 어렵지는 않았습니다. 그냥 위치 정보를 dictionary에 입력한 뒤에 문제에서 주어진 조건대로 주면 끝입니다. 음.. 근데 제가 풀 코드가 좀 마음에 안 드는게 pop()을 사용했다는 점입니다. 시간복잡도 측면에서는 별 문제가 없겠지만, 메모리 측면에서 문제가 발생할 수도 있을거 같은 느낌이 있네요..ㅋㅋ

def distance(left, right, ob, hand):
    lx, ly = left
    rx, ry = right
    obx, oby = ob

    l_d = abs(obx-lx) + abs(oby-ly)
    r_d = abs(obx-rx) + abs(oby-ry)

    if l_d > r_d:
        return 'R'
    elif l_d < r_d:
        return 'L'
    else:
        if hand == 'right':
            return 'R'
        else:
            return 'L'

def solution(numbers, hand):

    hand_dic = {
        1:(0, 3),
        4:(0, 2),
        7:(0, 1),
        '*': (0, 0),
        2:(1, 3),
        5:(1, 2),
        8:(1, 1),
        0:(1, 0),
        3:(2, 3),
        6:(2, 2),
        9:(2, 1),
        '#':(2, 0)
    }

    answer = []
    l_l = [(0, 0)]
    r_l = [(2, 0)]
    for number in numbers:
        if number in [1, 4, 7]:
            answer.append("L")
            l_l.pop()
            l_l.append(hand_dic[number])
        elif number in [3, 6, 9]:
            answer.append("R")
            r_l.pop()
            r_l.append(hand_dic[number])
        else:
            res = distance(l_l[-1], r_l[-1], hand_dic[number], hand)
            answer.append(res)
            if res == 'L':
                l_l.pop()
                l_l.append(hand_dic[number])
            else:
                r_l.pop()
                r_l.append(hand_dic[number])

    return "".join(answer)

if __name__ == "__main__":
    print(solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], "right"))
    print(solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], "left"))
    print(solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], "right"))
profile
'개발'은 '예술'이고 '서비스'는 '작품'이다

0개의 댓글