S E P H ' S

[Python] 키패드 누르기 본문

Algorithm/Programmers

[Python] 키패드 누르기

yoseph0310 2021. 7. 18. 15:51
 

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

[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

문제풀이

1. 가운데 2,5,8,0에 대해서 왼손, 오른손 중 어떤 것을 선택할지가 가장 중요한 아이디어이다.

2. 편의를 위해 *, # 를 각각 10, 12로 둔다

3. 주어진 numbers 배열을 돌면서 n이 1,4,7에 있으면 왼손, 3,6,9에 있으면 오른손

4. n이 그외의 숫자라면 2,5,8,0 (n이 0 이면 11로, 아니면 n으로) 일때 처리

5. n과 마지막 누른 번호와의 거리의 절댓값을 구한다.

6. 만약 n이 2이고 lastL이 7인 경우를 생각해보자. absL은 5가 되고 키패드 상에서의 움직여야하는 거리는 좌우로는 +-1칸, 위아래로는 +-3 일 것이다. 그러므로 absL을 3으로 나눈 나머지와 몫을 더하면 키패드 상의 거리를 구할 수 있다. 이를 가지고 왼손, 오른손 판단을 한다.

7. 그 이외의 경우로 두 엄지손가락의 거리가 같으면 hand를 사용해 키패드를 누른다.

 

def solution(numbers, hand):
    answer = ''
    lastL = 10
    lastR = 12
    
    for n in numbers:
        if n in [1,4,7]:
            answer += 'L'
            lastL = n
        elif n in [3,6,9]:
            answer += 'R'
            lastR = n
        else:
            n = 11 if n == 0 else n
            
            absL = abs(n - lastL)
            absR = abs(n - lastR)
            
            if sum(divmod(absL, 3)) > sum(divmod(absR, 3)):
                answer += 'R'
                lastR = n
            elif sum(divmod(absL, 3)) < sum(divmod(absR, 3)):
                answer += 'L'
                lastL = n
            else:
                if hand == 'left':
                    answer += 'L'
                    lastL = n
                else:
                    answer += 'R'
                    lastR = n
                    
    return answer​