BOJ/Python

[프로그래머스] 키패드 누르기 파이썬

띵지니어 2023. 11. 24. 16:25

https://school.programmers.co.kr/learn/courses/30/lessons/67256

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 보기

 

내 코드

def judge(start, end):
    keypad = {
        '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)
    }

    start_distance = keypad[start]
    end_distance = keypad[end]

    distance = abs(start_distance[0] - end_distance[0]) + abs(start_distance[1] - end_distance[1])
    return distance


def solution(numbers, hand):
    
    l = "*"
    r = "#"
    l_pad = ["1", "4", "7"]
    r_pad = ["3", "6", "9"]
    numbers = list(map(str, numbers))
    result = []
    
    for number in numbers:
        if number in l_pad:
            result.append("L")
            l = number
        elif number in r_pad:
            result.append("R")
            r = number
        else:
            left_distance = judge(l, number)
            right_distance = judge(r, number)
            if left_distance == right_distance:
                if hand == "left":
                    result.append("L")
                    l = number
                elif hand == "right":
                    result.append("R")
                    r = number
            elif left_distance > right_distance:
                    result.append("R")
                    r = number
            else:
                result.append("L")
                l = number
    
    return ''.join(result)

 

Review

 

문제를 보자마자 느꼈던 건.. 일단 구현이다고 느꼈습니다.

level 1보다는 어려웠던 것 같다고 생각을 하였으나, 막상 다 풀다 보면 별게 없었다.. 하는 게 제 총평입니다.


 

위치를 저장하고 있어야 하여, 필요한 변수 l(엘) 과 r(알) 을 초기화하였습니다. (왼손은 * , 오른손은 #)

여기서 특별히 구현해야 할 것은 거리 계산 알고리즘 이라고 생각했고, 따로 함수로 빼서 계산을 하였습니다.

def judge(start, end): # 거리 계산 알고리즘
    keypad = {
        '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)
    }

    start_distance = keypad[start]
    end_distance = keypad[end]

    distance = abs(start_distance[0] - end_distance[0]) + abs(start_distance[1] - end_distance[1])
    return distance

2차원 배열의 좌표로 거리를 계산해 주었습니다.

원래 상수로 모든 처리를 하려고 했으나 너무 비효율이고, 코드가 더러워 보여서 뺐습니다.

 



이후 제가 적었던 논리대로 if ~ else 문을 활용하여 조건을 나누어 계산을 하였고,

마지막에 join으로 result에 있는 원소들을 문자열로 합쳐주었습니다.

''.join(result)