[프로그래머스(파이썬/Python)] 키패드 누르기(2020 카카오 인턴십)

kindof

·

2021. 8. 29. 01:34

https://programmers.co.kr/learn/courses/30/lessons/67256

 

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

[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

 

문제의 요구사항을 그대로 구현하면 됩니다.

 

키패드의 숫자의 위치를 dictionary 형태로 표현했는데 key = 키패드의 숫자,  value = 숫자의 위치로 지정했습니다.

 

그리고 주어지는 각 숫자에 대해 해당 숫자가 1, 4, 7(맨 왼쪽 열)중 하나라면 왼손으로 입력하고, 마찬가지로 해당 숫자가 3, 6, 9(맨 오른쪽 열)중 하나라면 오른손으로 입력합니다. 물론, 입력 후에는 손의 위치를 해당 위치로 바꿔주어야겠죠?

 

한편, 주어지는 숫자가 가운데 열에 있는 숫자(2, 5, 8, 0)이라면 왼손과 오른손의 현재 위치와의 거리를 비교하면 되고 마지막으로 거리가 같다면 왼손잡이인가, 오른손잡이인가에 의해 조건문을 분기해서 풀어주면 될 것 같습니다.

 

[풀이]

def solution(numbers, hand):
    answer = ''
    
    # 자판 정보와 초기 엄지 손가락 위치 입력받기
    left, right = [3,0], [3,2]
    board = dict()
    num = 1
    for i in range(3):
        for j in range(3):
            board[num] = [i,j]
            num += 1
    board[0] = (3,1)

    
    for num in numbers:
        
        # 숫자가 위치하는 배열의 인덱스
        x, y = board[num][0], board[num][1]
        
        if y == 0: # 1, 4, 7
            answer += "L"
            left = [x,y]

        elif y == 2: # 3, 6, 9
            answer += "R"
            right = [x,y]
        
        else: # 2, 5, 8, 0    
            left_distance = abs(y - left[1]) + abs(x-left[0])
            right_distance = abs(y-right[1]) + abs(x-right[0])
            
            if left_distance < right_distance:
                answer += "L"
                left = [x,y]
            elif left_distance > right_distance:
                answer += "R"
                right = [x,y]
            else:
                if hand == "right":
                    answer += "R"
                    right = [x,y]
                else:
                    answer += "L"
                    left = [x,y]
    
    return answer