Sad Puppy 3 [프로그래머스 lv3]다단계 칫솔 판매 :: 개발자 아지트

https://school.programmers.co.kr/learn/courses/30/lessons/77486

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제설명

민호는 다단계 조직을 이용하여 칫솔을 판매하고 있습니다. 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배되는 형태의 판매망입니다. 어느정도 판매가 이루어진 후, 조직을 운영하던 민호는 조직 내 누가 얼마만큼의 이득을 가져갔는지가 궁금해졌습니다. 예를 들어, 민호가 운영하고 있는 다단계 칫솔 판매 조직이 아래 그림과 같다고 합시다.

 

민호는 center이며, 파란색 네모는 여덟 명의 판매원을 표시한 것입니다. 각각은 자신을 조직에 참여시킨 추천인에 연결되어 피라미드 식의 구조를 이루고 있습니다. 조직의 이익 분배 규칙은 간단합니다. 모든 판매원은 칫솔의 판매에 의하여 발생하는 이익에서 10% 를 계산하여 자신을 조직에 참여시킨 추천인에게 배분하고 나머지는 자신이 가집니다. 모든 판매원은 자신이 칫솔 판매에서 발생한 이익 뿐만 아니라, 자신이 조직에 추천하여 가입시킨 판매원에게서 발생하는 이익의 10% 까지 자신에 이익이 됩니다. 자신에게 발생하는 이익 또한 마찬가지의 규칙으로 자신의 추천인에게 분배됩니다. , 10% 를 계산할 때에는 원 단위에서 절사하며, 10%를 계산한 금액이 1 원 미만인 경우에는 이득을 분배하지 않고 자신이 모두 가집니다.

 

 

문제 해결 방법

딕셔너리를 사용하여 문제를 해결함 

money의 10%는 money // 10을 한 값과 같음 


코드 구현

 

def solution(enroll, referral, seller, amount):
    answer = []

    dic = { }
    dic['-'] = []
    for i in enroll:
        if i in dic:
            continue
        else:
            dic[i] = []
    
    for i in range(len(referral)):
        key = enroll[i]
        dic[key] = referral[i]
    
    
    total = {name : 0 for name in enroll}
    
    for i in range(0, len(seller)):
        key = seller[i]
        
        money = amount[i] * 100
        
        curName = seller[i]
        
        while money > 0 and curName != '-':
            total[curName] +=money - money//10
            curName = dic[curName] # curName의 부모
            money = money//10
    
    
    return [total[name] for name in enroll]

 

시간/공간 복잡도

O(N*M)

N: enroll의 길이 

M: seller의 길이 

 

최적화 및 개선

따로 하지 않음

 

어려웠던 점

문제를 권장 시간안에 풀지 못했음, 부모 자식 관계 구현에 대해 서툴어서 문제 해결 방법을 생각해내지 못했음 

딕셔너리로 풀어야겠다는 생각을 늦게함

+ Recent posts