본문 바로가기

CodeGym/프로그래머스

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

728x90


문제설명

 

제한사항

 

입출력 예


문제풀이

  • 별다른 개념이 들어간 문제는 아니었지만 문제를 해결하는데 필요한 설계가 까다로운 문제였다. 우선 키패드 모양을 좌표와 배열로 구현할 수 있어야 하며 눌러야하는 키패드의 위치를 하나씩 확인하면서 어느 손으로 눌러야 할지를 정한다. 이때 손을 결정하는 기준은 우선적으로는 가까이 있는 손을 선택하며 거리가 같을 경우 hand 변수에 주어진 손이 우선권을 가지고 누르게 된다.
  • 처음에는 문제에서 접근하는 방식을 표로 잘 설명해 주었는데 이때 사용된 왼손, 오른손 위치와 눌러야 하는 키의 위치를 기반으로 어떠한 손으로 누르는지를 잘 확인할 필요가 있다. 그리고 키패드를 누르고 나면 해당 손의 위치를 그곳으로 이동시켜주는 것도 빠져서는 안된다.(그래서 조건문 분기를 타면 버튼을 누른것이 때문에 가장 먼저 위치부터 바꾸어 줬다.)

코드 & 설명

kp = {
    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]}

def dist(p1, p2):
    y1, x1 = p1
    y2, x2 = p2
    return abs(y2-y1) + abs(x2-x1)

def solution(numbers, hand):
    answer = ''
    l_pos=kp['*']
    r_pos=kp['#']
    
    for num in numbers:
        if num in [1, 4, 7]:
            l_pos=kp[num]
            answer+='L'
        elif num in [3, 6, 9,]:
            r_pos=kp[num]
            answer+='R'
        else:
            if dist(r_pos, kp[num]) < dist(l_pos, kp[num]):
                r_pos = kp[num]
                answer += "R"
            elif dist(r_pos, kp[num]) > dist(l_pos, kp[num]):
                l_pos = kp[num]
                answer += 'L'
            else:
                if hand == "right":
                    r_pos = kp[num]
                    answer += "R"
                else:
                    l_pos = kp[num]
                    answer += 'L'
    return answer

 

 

728x90