본문 바로가기

Algorithm

다단계 칫솔 판매 (77486번) - 프로그래머스 (Programmers)

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

 

프로그래머스

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

programmers.co.kr

 

 

프로그래머스 - 다단계 칫솔 판매 (77486번)

 

난이도 : Lv 3

알고리즘&자료구조 : Tree (트리)

 

def solution(enroll, referral, seller, amount):
    mapping = {name: i for i, name in enumerate(enroll)}
    seller = [mapping[name] for name in seller]
    referral = [mapping[name] if name != '-' else -1 for name in referral]
    answer = [0] * len(enroll)
    for name, sell in zip(seller, map(lambda x: x*100, amount)):
        while name != -1 and sell:
            sell, r = divmod(sell, 10)      
            answer[name] += sell*9 + r
            name = referral[name]
    return answer

 

 

2021 Dev-Matching: 웹 백엔드 개발자(상반기) 기출문제이다.

 

 

영어 소문자로 구성된 이름들을, enroll 기준으로 숫자 index로 바꿔준다.

 

enroll 을 자식 노드의 집합, referral 을 부모 노드의 집합이라고 볼 수 있다.

 

칫솔 하나당 100원이므로, amount 의 모든 원소에 각각 100을 곱한다.

 

seller 의 각 원소에 대해서, 

while 문을 통해 각각의 단계에서 10%씩 떼서 부모 노드로 올라가고,

나머지 90%와 10으로 나눈 나머지는, 현재 노드의 누적 이익금에 더해준다.

만약 현재 노드가 "center" 이거나, 10% 뗀 금액이 0원이 되면, while 문을 중단한다.

 

이렇게 모든 seller 의 원소들을 for 문을 통해 순회하고 나면,

각 판매원의 최종 누적 이익금이 answer에 기록되고, 이것을 출력하면 된다.