보물창고 블로그

2020 카카오 인턴십 키패드 누르기 풀이 With Python 본문

알고리즘 풀이/프로그래머스

2020 카카오 인턴십 키패드 누르기 풀이 With Python

홋 메 2020. 7. 6. 19:53
728x90

문제 링크: 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

실제 시험 당시에는 경우의 수를 생각하여 풀었지만, 복원된 문제를 다시 풀었을 때는 Dict 자료구조를 통해 각 키패드마다 좌표 값을 부여하여 각 상황마다 눌러야 하는 번호와 왼손과 오른손의 위치와의 거리를 계산하여 문제를 해결하였습니다. 소스코드는 아래와 같습니다.

def solution(numbers, hand):
    answer = ''
    left = '*'
    right = '#'
    # 각 키패드마다 위치 값을 Dict를 통해 부여합니다.
    position = {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)}
    # 입력해야 할 키패드를 1개씩 가져옵니다.
    for num in numbers:
    	# 키패드가 1 또는 4 또는 7이면 무조건 왼손으로 입력해아 합니다.(문제에 주어짐)
        if num == 1 or num == 4 or num == 7:
            answer += 'L'
            left = num
        # 키패드가 3 또는 6 또는 9이면 무조건 오른손으로 입력해아 합니다.(문제에 주어짐)
        elif num == 3 or num == 6 or num == 9:
            answer += 'R'
            right = num
        # 눌러야 할 키패드가 가운데에 있을 경우 오른손과 왼손과의 거리를 계산하여 결정합니다.
        else:
        	#왼손의 거리
            ld = abs(position[left][0] - position[num][0]) + abs(position[left][1] - position[num][1])
            #오른손의 거리
            rd = abs(position[right][0] - position[num][0]) + abs(position[right][1] - position[num][1])
            #만약 오른손의 거리가 더 작다면
            if ld > rd:
                answer += 'R'
                right = num
            #만약 왼손의 거리가 더 작다면
            elif rd > ld:
                answer += 'L'
                left = num
            # 왼손과 오른손의 거리가 같다면 hand의 값에 따라 정답값을 입력합니다.
            else:
                if hand == 'right':
                    answer += 'R'
                    right = num
                else:
                    answer += 'L'
                    left = num
    return answer

소스코드에 대한 질문이 있으시면 댓글을 남겨주시면 답변드리겠습니다. 읽어주셔서 감사합니다. :-)

Comments