관리 메뉴

솜씨좋은장씨

[Programmers] 2020 카카오 인턴십 - 키패드 누르기 (Python) 본문

Programming/코딩 1일 1문제

[Programmers] 2020 카카오 인턴십 - 키패드 누르기 (Python)

솜씨좋은장씨 2021. 5. 5. 00:57
728x90
반응형

코딩 1일 1문제! 오늘의 문제는 2020 카카오 인턴십 문제였던 프로그래머스의 키패드 누르기 입니다!

오늘은 날씨가 좋아 해방촌 남산아래라는 카페에서 따사로운 햇살을 맞으며 문제를 풀어보았습니다.

 

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

[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

Solution

def get_distance(keypad, finger_position, next_number):
    next_number_position = keypad[next_number]
    
    distance = abs(finger_position[0] - next_number_position[0]) + abs(finger_position[1] - next_number_position[1])
    
    return distance

def solution(numbers, hand):
    result = ''
    
    keypad = {
        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],
        0: [3, 1]
    }
    
    left_finger_numbers = [1, 4, 7]
    right_finger_numbers = [3, 6, 9]
    center_finger_numbers = [2, 5, 8, 0]
    
    left_finger_position = [3, 0]
    right_finger_position = [3, 2]
    
    for number in numbers:
        if number in left_finger_numbers:
            result += 'L'
            left_finger_position = keypad[number]
        elif number in right_finger_numbers:
            result += 'R'
            right_finger_position = keypad[number]
            
        else:
            left_finger_distance = get_distance(keypad, left_finger_position, number)
            right_finger_distance = get_distance(keypad, right_finger_position, number)
            
            if left_finger_distance > right_finger_distance:
                result += 'R'
                right_finger_position = keypad[number]
            elif left_finger_distance < right_finger_distance:
                result += 'L'
                left_finger_position = keypad[number]
            elif left_finger_distance == right_finger_distance:
                result += hand[0].upper()
                if hand == 'right':
                    right_finger_position = keypad[number]
                elif hand == 'left':
                    left_finger_position = keypad[number]      
        
    return result

Solution 풀이

3X4로 이루어진 키패드의 좌표를 keypad라는 dictionary로 하나 선언하여 각각의 번호를 키로 활용하여 그 번호의 좌표를 가져올 수 있도록 하였습니다.

그리고 각각 왼손이 클릭해야하는 번호 오른손이 클릭해야하는 번호를 

왼손은 left_finger_nubmers 오른손은 right_finger_numbers로 선언해 두었습니다.

그리고 처음 손가락의 포지션은 왼손은 * 오른손은 # 이므로 각각 해당하는 좌표를 넣어 두었습니다.

이제 입력해야하는 번호목록에서 번호를 하나씩 불러옵니다.

만약 오른손이 눌러야하는 번호인 3, 6, 9 중에 하나인 번호거나 왼손이 눌러야하는 1, 4, 7 중에 하나라면

각각 R과 L을 정답에 넣어주도록하고

그렇지 않은 경우에는 현재 손가락과 다음에 눌러야하는 손가락의 거리를 왼손, 오른손 각각 구합니다.

여기서 거리를 구하는 방법은 두 번호 사이의 x, y 좌표 차이를 더한 만큼입니다.

만약 오른손 손가락의 번호가 3 -> 위치 (0, 2)

그리고 다음에 눌러야하는 번호가 5라면 -> 위치 (1, 1)

오른손 손가락의 번호와 다음에 눌러야하는 번호와의 거리는 (0-1) 의 절대값인 1과 (2-1)의 절대값인 1을 더한 2가 됩니다.

이렇게 각각 왼손과 오른손의 다음 번호와의 거리를 구해 더 가까운 손가락의 문자를 result에 더해주었고

만약 같을 경우에는 이 키패드를 입력하는 사람이 사용하는 손을 따라가기로 하여

오른손 잡이면 R을 왼손잡이면 L을 result에 더해주도록 하였습니다.

 

SOMJANG/CODINGTEST_PRACTICE

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

Comments