[프로그래머스](python) 키패드 누르기 - 2020 카카오 인턴십

berry ·2021년 7월 7일
0

Algorithm

목록 보기
50/77
post-thumbnail

문제

가운데 키패드를 누를 때의 알고리즘을 짜는 게 관건!


🧩 수도 코드

번호를 누를 때마다 그 번호로 리셋하기
왼쪽, 오른쪽, 가운데 키패드의 조건을 따로 만들고
가운데 키패드를 누를 때 고려해야할 조건 1.distance 2.hand


🏁 내 풀이

def solution(numbers, hand):
    answer = ''
    last_l = 10
    last_r = 12
    
    pad = [[1,4,7],[2,5,8],[3,6,9]]

    for num in numbers:
        if num in pad[0]: # Left
            answer += 'L'
            last_l = num
        elif num in pad[2]: # Right
            answer += 'R'
            last_r = num
        else: # Middle'
            num = 11 if num == 0 else num

            abs_l = abs(num-last_l) # 거리 계산하기 위해
            abs_r = abs(num-last_r)

            if sum(divmod(abs_l, 3)) > sum(divmod(abs_r, 3)):
                answer += 'R'
                last_r = num
            elif sum(divmod(abs_l, 3)) < sum(divmod(abs_r, 3)):
                answer += 'L'
                last_l = num
            else:
                if hand == 'left':
                    answer += 'L'
                    last_l = num
                else:
                    answer += 'R'
                    last_r = num
    return answer
answer = ''
last_l = 10
last_r = 12
pad = [[1,4,7],[2,5,8],[3,6,9]]
  • numbers 리스트에서 하나씩 처리한 후 덮어 씌울 변수
    왼손 엄지가 올려 있는 번호를 last_l,
    오른손 엄지가 올려 있는 번호를 last_r로 정함
  • pad로 키패드 왼쪽, 가운데, 오른쪽 나누어주었다.

for num in numbers:

if num in pad[0]:

answer += 'L'
last_l = num

  • 숫자가 [1,4,7]에 있을 때,
    answer에 'L'을 더하고
    손가락이 올려있는 숫자를 마지막 숫자로

elif num in pad[2]:

answer += 'R'
last_r = num

  • 숫자가 [3,6,9]에 있을 때,
    answer에 'R'을 더하고
    손가락이 올려있는 숫자를 마지막 숫자로

else:

num = 11 if num == 0 else num
abs_l = abs(num-last_l) # 거리 계산하기 위해
abs_r = abs(num-last_r)

  • 숫자가 [2,5,8]에 있을 때,
    계산하기 쉽게 '*'을 10, 0을 11, '#'을 12로 변수 설정해둠

📌 거리 계산

  • (|a-b|//3) + (|a-b|%3) (a-b)/3의 몫 + (a-b)/3의 나머지
    |a-b|를 변수에 저장

if sum(divmod(abs_l, 3)) > sum(divmod(abs_r, 3)):

answer += 'R'
last_r = num

  • (|a-b|//3) + (|a-b|%3)
    왼쪽 마지막 숫자와의 거리 : sum(divmod(abs_l, 3))
    오른쪽 마지막 숫자와의 거리: sum(divmod(abs_r, 3))
    왼쪽 마지막 숫자와 새로운 숫자의 거리가 더 크면
    더 가까운 right hand가 가고 answer + R,
    오른쪽 마지막 숫자로 덮어짐

elif sum(divmod(abs_l, 3)) < sum(divmod(abs_r, 3)):

answer += 'L'
last_l = num

  • 위와 동일

else:

if hand == 'left':

answer += 'L'
last_l = num

else:

answer += 'R'
last_r = num

return answer

  • 가운데 키패드 누를 때의 두 번째 조건 hand에 따른 조건문


오래 걸렸다 🥸 헥헥


profile
Engineer

0개의 댓글