본문 바로가기
[PYTHON]

[프로그래머스]LV1. 키패드 누르기

by b___gly 2022. 4. 23.

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

 

우선, 접근 못 했다.

겁내 어렵드만. 이런 걸 풀어야 카카오에 들어갈 수 있구나. 포기한다.

코드 해설만 해야겠다.

 

풀이

def solution(numbers, hand):
    answer = ''
    
    # 왼손 위치를 숫자상으로는 10, 오른손 위치를 숫자상으로 12에 둠. 즉, 0은 11의 위치.
    lastL = 10
    lastR = 12
    
    # [1,4,7]누를 땐, result에 L 반환. 그리고 왼손의 마지막 위치는 [1,4,7]중에 있을거임.
    # [3,6,9]누를 땐, result에 R 반환. 그리고 오른손의 마지막 위치는 [3,6,9]중에 있을거임.
    # 다 아닐 땐, n이 0이면, n은 11로 해석. else면 n값 그대로 놔둠. 즉 여기선 [2,5,8]
    for n in numbers:
        if n in [1,4,7]:
            answer+='L'
            lastL = n
        elif n in [3,6,9]:
            answer+='R'
            lastR = n
        else:
            n = 11 if n == 0 else n
            
            # 다음에 누를 n과 왼손, 오른손의 마지막 위치를 뺌.
            absL = abs(n-lastL)
            absR = abs(n-lastR)
            
            # 그래서 몫과 나머지를 더한 값이 더 작은 쪽이 움직여야 함.
            if sum(divmod(absL, 3)) > sum(divmod(absR, 3)):
                answer+='R'
                lastR = n
            elif sum(divmod(absL, 3)) < sum(divmod(absR, 3)):
                answer +='L'
                lastL = n
            #만약 둘이 같다면, 왼손잡이는 L을 반환하고, 오른손잡이는 R을 반환.
            else:
                if hand == 'left':
                    answer+='L'
                    lastL = n
                else:
                    answer+='R'
                    lastR = n
                
    return answer

 

예시

numbers = [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]
hand = 'right'

# 여기서는 [4,5,8]에서 5랑, [4,5,9]에서 5를 예시로.

def solution(numbers, hand):
    answer = ''
    lastL = 10
    lastR = 12
    
    """
    ① 여기까지는 result=[LRL]이 들어가있음.
    ② 여기까지는 result=[LRLLLRLL]
    """
    for n in numbers:
        if n in [1,4,7]:
            answer+='L'
            lastL = n
        elif n in [3,6,9]:
            answer+='R'
            lastR = n
        else:
            n = 11 if n == 0 else n

            absL = abs(n-lastL)
            absR = abs(n-lastR)
            
            """
            ① [4,5,8]에서 다음에 5를 눌러야 할 상황
            여기서 마지막 위치 왼손은 4, 오른손은 3
            그리고 absL은 1, absR은 2
            그리고 3으로 나눠준 몫과 나머지를 더해주면 
            왼손은 몫 0 나머지 1 , 오른손은 몫 0 나머지 2
            여기서는 sum 비교하면 오른손이 더 크니까, 왼손이 더 가까운 것.
            그래서 result에 L 반환. 왼손은 5에, 오른손은 3에 있음.
            """
            
            """
            ② [4,5,9]에서 다음에 5를 눌러야 할 상황
            여기서 마지막 왼손 위치는 4, 오른손은 2에 잇음
            그리고 absL은 1 absR 3
            그리고 3으로 나눠준 몫과 나머지를 더해주면
            왼손은 몫 0 나머지 1, 오른손은 몫 1 나머지 0
            sum을 비교하면 똑같으니까 그럴 경우엔 hand를 체크함.
            여기서는 hand가 right이니까 오른손 움직여야함. 
            result에 R 반환. 왼손은 4, 오른손은 5에 있음. 
            """

            if sum(divmod(absL, 3)) > sum(divmod(absR, 3)):
                answer+='R'
                lastR = n
            elif sum(divmod(absL, 3)) < sum(divmod(absR, 3)):
                answer +='L'
                lastL = n
            else:
                if hand == 'left':
                    answer+='L'
                    lastL = n
                else:
                    answer+='R'
                    lastR = n
                
    """
    결과적으로 answer는 [LRLLLRLLRRL]이 반환됨.
    """
    return answer

댓글