PROGRAMMERS Python Lv1. 키패드 누르기

1 분 소요

이번 문제는 키패드 누르기이다.

나의 코드는 다음과 같다.

def solution(numbers, hand):
    answer = ''
    r_location = 12
    l_location = 10
    for n in numbers:
        if n in [1,4,7]:
            answer += 'L'
            l_location = n
        elif n in [3,6,9]:
            answer += 'R'
            r_location = n
        else:
            n = 11 if n == 0 else n

            absL = abs(n-l_location)
            absR = abs(n-r_location)

            if sum(divmod(absL, 3)) > sum(divmod(absR, 3)):
                answer+='R'
                r_location = n
            elif sum(divmod(absL, 3)) < sum(divmod(absR, 3)):
                answer +='L'
                l_location = n
            else:
                if hand == 'left':
                    answer+='L'
                    l_location = n
                else:
                    answer+='R'
                    r_location = n
    return answer

한시간 정도 고민하며 풀다 답의 절반까지 맞추고 나서 그 이후는

구글을 통해 다른 사람의 풀이를 참고했다.

이 문제를 풀기 위해선 다음과 같은 생각이 필요했다.

  1. 1,4,7의 키패드는 “L”

  2. 3,6,9의 키패드는 “R”

이 두가지는 변함없는 것이다. 그렇다면 다음 두가지를 집중해서 봐야한다.

  1. 2,5,8,0을 어떻게 고를 건지가 이 문제의 관건이다.

  2. 왼손과 오른손의 가장 최근 위치를 기억할 공간이 필요하다.

이 두가지를 기억한 후 코드로 적어보면 다음과 같다.

def solution(numbers, hand):
    answer = ''
    r_location = 12
    l_location = 10
    for n in numbers:
        if n in [1,4,7]:
            answer += 'L'
            l_location = n
        elif n in [3,6,9]:
            answer += 'R'
            r_location = n

이 부분까진 쉽게 접근할 수 있다. 시작 위치인 * / # 을 각각 10 과 12로 지정해줬다.

이 다음부분을 풀기 위해 해결해야 했던 문제는

과연 각각의 위치와 다음에 눌러야 할 번호의 거리를

어떻게 계산할 것인가이다.

단순히 2와 5의 거리를 뺄셈으로 계산하면 3이지만

이 둘의 거리는 1이기 때문에 이를 해결해야 한다.

해답은 바로 divmod 함수이다.

2,5,8,0 이 숫자들의 거리는 3씩 차이난다.

else:
    n = 11 if n == 0 else n

여기서 0도 11로 바꿔주면 계산이 편하다.

따라서 divmod를 이용해서 3으로 나눈 몫과 나머지를

더해준다면 그것이 거리가 될 것이다.

이를 비교해주고 만약 거리가 같을 경우,

hand를 이용해줘서 hand에 맞는 answer를 더해주면 된다.

댓글남기기