코테 노트/프로그래머스

Level 1 키패드 누르기 <2020 카카오 인턴십> Python 3

화요밍 2021. 8. 24. 16:04
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/67256?language=python3 

 

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

[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

 

최종 코드

 

GitHub - hwayeon351/Programmers-Algorithms: 프로그래머스 알고리즘 소스 코드 모음

프로그래머스 알고리즘 소스 코드 모음. Contribute to hwayeon351/Programmers-Algorithms development by creating an account on GitHub.

github.com

def solution(numbers, hand):
    keypad = {1:['L', [0, 0]], 4:['L', [0, 1]], 7:['L', [0, 2]], 3:['R', [2, 0]], 6:['R', [2, 1]], 9:['R', [2, 2]], 2:['LR', [1, 0]], 5:['LR', [1, 1]], 8:['LR', [1, 2]], 0:['LR', [1, 3]]}
    left = [0, 3]
    right = [2, 3]
    answer = ''
    for n in numbers:
        if keypad[n][0] == 'L':
            answer += keypad[n][0]
            left = keypad[n][1]
        elif keypad[n][0] == 'R':
            answer += keypad[n][0]
            right = keypad[n][1]
        else:
            l_dis = abs(left[0]-keypad[n][1][0]) + abs(left[1]-keypad[n][1][1])
            r_dis = abs(right[0]-keypad[n][1][0]) + abs(right[1]-keypad[n][1][1])
            if l_dis == r_dis:
                if hand == 'right':
                    answer += 'R'
                    right = keypad[n][1]
                else:
                    answer += 'L'
                    left = keypad[n][1]
            elif l_dis < r_dis:
                answer += 'L'
                left = keypad[n][1]
            else:
                answer += 'R'
                right = keypad[n][1]
    return answer

풀이 과정

풀이 시간 14분

 

def solution(numbers, hand):
	#keypad[n] = [손가락, [x, y]]
	#손가락 = 키패드의 숫자를 누르는데 사용하는 손가락, 'L'-왼손, 'R'-오른손, 'LR' = 왼손 또는 오른손
    #[x, y] = 키패드를 2차원 배열로 나타냈을 때 숫자 n의 위치
    keypad = {1:['L', [0, 0]], 4:['L', [0, 1]], 7:['L', [0, 2]], 3:['R', [2, 0]], 6:['R', [2, 1]], 9:['R', [2, 2]], 2:['LR', [1, 0]], 5:['LR', [1, 1]], 8:['LR', [1, 2]], 0:['LR', [1, 3]]}
    
    #현재 왼손과 오른손이 있는 위치, 처음에 왼손은 '*'이 있는 위치, 오른손은 '#'이 있는 위치에 있다
    left = [0, 3]
    right = [2, 3]
    
    answer = ''
    for n in numbers:
    	#숫자 n을 누르는 손가락이 'L'인 경우, 왼손의 위치를 해당 숫자의 위치로 바꿔준다
        if keypad[n][0] == 'L':
            answer += keypad[n][0]
            left = keypad[n][1]
        #숫자 n을 누르는 손가락이 'R'인 경우, 오른손의 위치를 해당 숫자의 위치로 바꿔준다
        elif keypad[n][0] == 'R':
            answer += keypad[n][0]
            right = keypad[n][1]
        #숫자 n을 누르는 손가락이 'LR'인 경우,
        else:
        	#숫자의 위치와 현재 손의 위치의 차를 통해 왼손과 오른손 거리를 구한다
            l_dis = abs(left[0]-keypad[n][1][0]) + abs(left[1]-keypad[n][1][1])
            r_dis = abs(right[0]-keypad[n][1][0]) + abs(right[1]-keypad[n][1][1])
            #왼손과 오른손 거리가 같은 경우,
            if l_dis == r_dis:
            	#오른손잡이이면, 오른손으로 누르고 오른손의 위치를 숫자 n의 위치로 바꿔준다
                if hand == 'right':
                    answer += 'R'
                    right = keypad[n][1]
                #왼손잡이이면, 왼손으로 누르고 왼손의 위치를 숫자 n의 위치로 바꿔준다
                else:
                    answer += 'L'
                    left = keypad[n][1]
            #왼손거리가 더 가까운 경우, 왼손으로 누르고 왼손의 위치를 숫자 n의 위치로 바꿔준다
            elif l_dis < r_dis:
                answer += 'L'
                left = keypad[n][1]
            #오른손거리가 더 가까운 경우, 오른손으로 누르고 오른손의 위치를 숫자 n의 위치로 바꿔준다
            else:
                answer += 'R'
                right = keypad[n][1]
    return answer
#시간복잡도 = O(len(numbers)) = O(n), 공간복잡도 = O(n)

참고

 

Level 2 수식 최대화 <2020 카카오 인턴십> Python 3

https://programmers.co.kr/learn/courses/30/lessons/67257?language=python3 코딩테스트 연습 - 수식 최대화 IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급..

hwayomingdlog.tistory.com

 

Level 3 보석 쇼핑 <2020 카카오 인턴십> Python 3

https://programmers.co.kr/learn/courses/30/lessons/67258?language=python3 코딩테스트 연습 - 보석 쇼핑 ["DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"] [3, 7] programmers.co.kr 최..

hwayomingdlog.tistory.com

 

Level 3 경주로 건설 Python 3

https://programmers.co.kr/learn/courses/30/lessons/67259?language=python3 코딩테스트 연습 - 경주로 건설 [[0,0,0,0,0,0,0,1],[0,0,0,0,0,0,0,0],[0,0,0,0,0,1,0,0],[0,0,0,0,1,0,0,0],[0,0,0,1,0,0,0,1],[0,..

hwayomingdlog.tistory.com

  • 5. 동굴 탐험 -> 
728x90
반응형