코테 노트/프로그래머스

Level 3 다단계 칫솔 판매 Python 3

화요밍 2021. 7. 19. 23:24
728x90
반응형

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

 

코딩테스트 연습 - 다단계 칫솔 판매

민호는 다단계 조직을 이용하여 칫솔을 판매하고 있습니다. 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배되는 형태의 판매망입니다. 어느정도 판매가 이루어진 후,

programmers.co.kr

 

최종 코드

 

hwayeon351/Programmers-Algorithms

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

github.com

def solution(enroll, referral, seller, amount):
    levels = dict()
    earns = dict()
    for e, r in zip(enroll, referral):
        levels[e] = r
        earns[e] = 0
    for s, a in zip(seller, amount):
        e = a*100
        refer = levels[s]
        while refer != '-':
            fee = e//10
            earns[s] += (e-fee)
            e = fee
            s = refer
            refer = levels[s]
            if e == 0: break
        else: earns[s] += (e-e//10)
    return list(earns.values())

풀이 과정

풀이 시간 34분

트리 구조인 다단계 조직도를 levels 딕셔너리로 표현하였다. 이 때, key 값은 판매원이고 value는 해당 판매원을 추천한 추천인을 담아주었다.

seller 리스트 항목을 순서대로 탐색하면서 levels 딕셔너리를 통해 계속해서 추천인들을 탐색하며 이익을 계산해주고 추천인이 '-'인 경우 탐색을 종료하도록 하여 문제를 해결하였다.

def solution(enroll, referral, seller, amount):
	#key = 판매원, value = key를 추천한 추천인
    levels = dict()
    #key = 판매원, value = key의 이익
    earns = dict()
    #딕셔너리 초기화
    for e, r in zip(enroll, referral):
        levels[e] = r
        earns[e] = 0
    #이익 계산
    for s, a in zip(seller, amount):
    	#판매 수익 e과 s의 추천인 refer
        e = a*100
        refer = levels[s]
        #추천인이 '-'일 때까지 조직도를 탐색하여 이익 계산
        while refer != '-':
        	#추천인에게 줘야 할 이익금의 10%인 fee를 뺀 나머지를 판매원의 수익에 더함
            fee = e//10
            earns[s] += (e-fee)
            #다음 추천인을 탐색하기 위해 e, s, refer을 바꿔줌
            e = fee
            s = refer
            refer = levels[s]
            #만약 e가 0인 경우 추천인에게 나눠 줄 이익이 없으므로 반복 종료
            if e == 0: break
        #while문이 break에 걸리지 않고 종료되는 경우 실행
        #추천인이 center인 경우, 이익의 10%를 뺀 나머지를 판매원 수익에 더함
        else: earns[s] += (e-e//10)
    return list(earns.values())
    #시간복잡도 = O(nlogn), 공간복잡도 = O(n)

시간복잡도는 이익 계산을 해주는 알고리즘에서 seller의 길이만큼 바깥 for문이 반복되고 O(n), root 노드에 도달 할 때까지 while문이 해당 추천인의 트리 레벨만큼 발생한다.O(logn)

따라서, 시간복잡도는 O(nlogn)이며, 공간복잡도는 2개의 딕셔너리가 사용되고 각 key마다 value 값이 하나이기 때문에 O(n)이다.

728x90
반응형

'코테 노트 > 프로그래머스' 카테고리의 다른 글

Level 3 모두 0으로 만들기 Python 3  (0) 2021.07.20
Level 3 2 x n 타일링 Python3  (0) 2021.07.20
Level 3 순위 Python 3  (0) 2021.07.19
Level 3 가장 먼 노드 Python3  (0) 2021.07.18
Level 3 단속카메라 Python3  (0) 2021.07.16