프로그래밍 이야기/파이썬 코딩 테스트 스터디

파이썬 코딩테스트 스터디 6주차 #5 - 다단계 칫솔 판매

hoony926 2024. 8. 4. 13:35

 

 

 

 

 

프로그래머스

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

programmers.co.kr

 

 

문제 핵심 

 

본인 판매금액의 10%는 위로 올린다.

 

코딩테스트 합격자 되기 : 파이썬 편 - 299page

 

 

 

위 그림과 아래 표를 예시로 보면

young은 1,200원을 벌었다.

그러면 young의 부모는 edward이므로, young이 번 1,200원의 10%인

120원을 edward에 상납한다 

그리고 또 edward는 그 120원의 10%인 12원을 mary에 상납

그리고 또 mary는 그 12원의 10%인 1.2원(1원단위만) 1원을 center에 상납

 

코딩테스트 합격자 되기 : 파이썬 편 - 299page

 

  Young edward mary center
이익금 1,200원 120원 12원 1원
실제 이익 1,080원 108원 11원 -

 

 

이와 같은 구조로 되어있다.

 

 

 

입출력 예시

enroll referral seller amount result
["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"] ["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"] ["young", "john", "tod", "emily", "mary"] [12, 4, 2, 5, 10] [360, 958, 108, 0, 450, 18, 180, 1080]
["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"] ["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"] ["sam", "emily", "jaimie", "edward"] [2, 3, 5, 4] [0, 110, 378, 180, 270, 450, 0, 0]

 

 

코드

 

def solution(enroll, referral, seller, amount):
    
    
    
    #부모 자식 관계 정리  dict={ 자식 : 부모 }
    parent = dict(zip(enroll,referral))
    '''
    parent는 아래와 같은 딕셔너리
    {
       'john': '-',          john → -(민호)
       'mary': '-', 
       'edward': 'mary', 
       'sam': 'edward',       sam → edward → mary → - (민호)
       'emily': 'mary',              emily → mary → - (민호)
       'jaimie': 'mary',            jaimie → mary → - (민호) 
       'tod': 'jaimie',       tod → jaimie → mary → - (민호) 
       'young': 'edward'    young → edward → mary → - (민호)
    }
    '''
    
    #출력 형태 dict 생성 및 초기화
    #이렇게 초기화를 해놔야 구현이 편하다는 걸 이때 알았다. 
    total = {name:0 for name in enroll}
    #print(total)
    
    
    for i in range(len(seller)):
        #
        money = amount[i] * 100
        cur_name = seller[i]
        
        #핵심
        while money>0 and cur_name !="-":
            '''
            1. young → edward → mary → - (민호)
            2. john → -(민호)
            3. tod → jaimie → mary → - (민호) 
            '''
            #최종 결과 dict에 10프로 제외한 금액만큼 더함
            #0으로 초기화 했기 때문에 값이 있는지 없는지 체크 안해도됨
            total[cur_name] += (money- money//10)
            
            #현재 이름을 부모로 change , 트리 구조상 위로 올라가는 추상화
            cur_name = parent[cur_name]
            
            #money는 10프로로 줄임
            money//=10
            
            #위로 올라가는 개념
        
    return [total[name] for name in enroll]