Coding Test/Programmers_Python

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

  • -
728x90

키패드를 누르는 카카오 인턴십 문제이다. 방법을 알면 쉽게 해결이 가능하지만 제한사항을 놓칠 경우 해결하기 힘들다는 특징이 있다


문제

1. 키패드에서 왼손과 오른손 엄지손가락만을 이용해서 숫자만 입력하려고 한다

2. 왼엄지와 오른엄지는 각각 '*', '#'에 초기 위치를 잡는다

3. [1, 4, 7]은 왼손 엄지로만 누르고, [3, 6, 9]는 오른 엄지로만 누른다

4. [2, 5, 8, 0]은 둘 다 누를 수 있고, 보통은 더 가까운 쪽의 엄지를 이용해서 누른다

5. 숫자와 두 손가락 간의 거리가 같을 경우에는 hand에 적힌 주 사용 손으로 누른다 (왼손잡이, 오른손잡이)

6. 누른 손을 L 또는 R을 이용해서 나타내고 연속적인 문자열로 return하는 문제이다


무엇을 확인해야할까?

1. 키패드 각각에 좌표를 설정, 각 손가락의 초기 위치 설정하기

2. 왼손 엄지 또는 오른 손 엄지로만 누를 수 있는 지 확인하기

3. 둘 다 누를 수 있는 경우 현재 위치와 목표 위치 사이의 거리 구하기

4. 더 가까운 쪽의 손으로 누르되, 거리가 같다면 왼손잡이인 지 오른손잡이인 지 확인하기

5. 각각의 숫자를 누른 손을 L, R을 이용해 문자열에 넣고 현재 손가락 위치 업데이트 하기


코드 작성하기

def solution(numbers, hand):
    answer = ''
    # 키패드를 좌표로 변경
    num_pos = {1: [0, 0], 2: [0, 1], 3: [0, 2],
               4: [1, 0], 5: [1, 1], 6: [1, 2],
               7: [2, 0], 8: [2, 1], 9: [2, 2],
               '*': [3, 0], 0: [3, 1], '#': [3, 2]}
    # 시작 위치 지정
    left_pos = num_pos['*']
    right_pos = num_pos['#']

    for n in numbers:
        now_pos = num_pos[n]
        # 무조건 왼손으로 누르는 버튼과 오른손으로 누르는 버튼 처리
        if n in [1, 4, 7]:
            answer += 'L'
            left_pos = now_pos
        elif n in [3, 6, 9]:
            answer += 'R'
            right_pos = now_pos
        # 중앙 숫자들에 대한 처리
        else:  # 2, 5, 8, 0
            left_center = 0
            right_center = 0
            # 거리 계산하기 ( 절대값 사용 )
            for lp, rp, np in zip(left_pos, right_pos, now_pos):
                left_center += abs(lp - np)
                right_center += abs(rp - np)
            # 가까운 손에 따른 처리
            if left_center < right_center:
                answer += 'L'
                left_pos = now_pos
            elif left_center > right_center:
                answer += 'R'
                right_pos = now_pos
            # 두 손의 거리가 같은 경우 처리
            else:
                # 왼손잡이 / 오른손잡이 처리
                if hand == 'left':
                    answer += 'L'
                    left_pos = now_pos
                else:
                    answer += 'R'
                    right_pos = now_pos

    return answer

실행 결과

정상적으로 실행된다!


End

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.