본문 바로가기
알고리즘-python/Programmers 문제

[프로그래머스/1단계/파이썬(Python3)] 키패드 누르기

by 빅데이터1020 2021. 6. 16.
SMALL

문제 출처

 

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

 

풀이 코드

def solution(numbers, hand):
    answer = ''
    now_l=10
    now_r=12
    for n in numbers:
        if n in [1, 4, 7]:
            answer+='L'
            now_l=n
        elif n in [3, 6, 9]:
            answer+='R'
            now_r=n
        else:
            n=11 if n==0 else n
            
            abL=abs(now_l-n)
            abR=abs(now_r-n)
            
            if sum(divmod(abL, 3)) < sum(divmod(abR, 3)):
                answer+='L'
                now_l=n
            elif sum(divmod(abL, 3)) > sum(divmod(abR, 3)):
                answer+='R'
                now_r=n
            else:
                if hand == "right":
                    answer+='R'
                    now_r=n
                else:
                    answer+='L'
                    now_l=n
    return answer

 

코드 설명

*, 0, # 는 1~9까지의 숫자키와 규칙을 만들기 어렵기 때문에 각각 10, 11, 12로 재설정합니다.

[1, 4, 7] 과 [3, 6, 9] 와 [2, 5, 8, 0] 세 부분으로 나누어 규칙을 만듭니다.

 

1) 1, 4, 7 번호 규칙: 무조건 왼손 엄지가 누른다

2) 3, 6, 9 번호 규칙: 무조건 오른손 엄지가 누른다

3) 2, 5, 8, 0 번호 규칙: divmod() 와 절댓값을 이용한다

 

엄지손가락은 상하좌우로 이동하기 때문에 키패드들 사이에 아래와 같은 이동규칙이 발생합니다.

 

             ▲(-3)

(-1)◀        ▶(+1)

             ▼(+3)

 

좌우는 문제될 게 없지만, 상하는 차이가 3씩 나기 때문에 단순히 절댓값 차이만으로는 계산하기 어렵습니다.

그래서 현재위치와 타겟위치의 차이(절댓값)를 3으로 나누어주고

몫과 나머지의 크기를 비교해야 합니다.

오른손 엄지의 현재위치에서 타겟위치의 차이를 3으로 나눈 몫과 나머지를 A

왼손 엄지의 현재위치에서 타겟위치의 차이를 3으로 나눈 몫과 나머지를 B라고 둔 뒤

A와 B 중 크기가 작은 손가락으로 타겟버튼을 누르도록 코딩합니다.

 

LIST