[프로그래머스/파이썬] 키패드 누르기(67256) 풀이

업데이트:



문제 정보


풀이

문제

전화 키패드에서 숫자를 순서대로 누를 때, 왼손/오른손 중 어떤 손을 써야 하는지 규칙에 따라 문자열로 반환하는 문제입니다.

  • 왼쪽 열(1,4,7)은 왼손
  • 오른쪽 열(3,6,9)은 오른손
  • 가운데 열(2,5,8,0)은 현재 위치 기준 거리(맨해튼 거리) 비교
  • 거리가 같으면 주 손잡이(hand) 사용

코드

def solution(numbers, hand):
    answer = ''

    places = {i+1:(i//3, i%3) for i in range(9)}
    places['*'], places[0], places['#'] = (3, 0), (3, 1), (3, 2)
    cl, cr = '*', '#'
    for number in numbers:
        if number in [1, 4, 7]:
            answer += 'L'
            cl = number
        elif number in [3, 6, 9]:
            answer += 'R'
            cr = number
        else:
            diffL = abs(places[cl][0]-places[number][0]) +\
                    abs(places[cl][1]-places[number][1])
            diffR = abs(places[cr][0]-places[number][0]) +\
                    abs(places[cr][1]-places[number][1])

            if diffL < diffR or (diffL == diffR and hand=='left'):
                answer += 'L'
                cl = number
            else:
                answer += 'R'
                cr = number
            
    
    return answer

설명

키패드 숫자를 좌표로 매핑해 두면, 가운데 열 버튼 선택 시 거리 계산을 간단하게 처리할 수 있습니다.

  • places 딕셔너리에 숫자별 (행,열) 저장
  • cl, cr로 현재 왼손/오른손 위치 추적
  • 가운데 열 숫자는 |r1-r2| + |c1-c2|로 거리 비교

거리 비교 규칙만 정확히 구현하면 바로 통과 가능한 구현 문제입니다.



댓글남기기