카테고리 없음

[Python] Programmers 다단계 칫솔 판매

정찡이 2021. 7. 31. 18:32
728x90

1. 문제 링크

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

 

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

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

programmers.co.kr


2. 문제 요약

  • 부모 노드에게 10% 수익을 배분하여 판매원들의 이익금을 구하는 문제

3. 아이디어 정리

판매자 별 부모에게 칫솔 수익을 나눠준다.

  1. 부모가 있는 경우
    • 부모에게 수익 배분 & 자신의 수익에서 배분한 금액만큼 빼기
    • 내 부모가 부모의 부모에게 수익 배분하기 위해 재귀 호출
  2. 부모가 없는 경우고 센터한테만 수익 배분하고 끝

4. 문제 풀이

4-1. 내 풀이

def solution(enroll, referral, seller, amount):
    """
    칫솔 1개 = 100원
    :param enroll: 각 판매원의 이름을 담은 배열
    :param referral: 각 판매원을 다단계 조직에 참여시킨 다른 판매원의 이름을 담은 배열
    :param seller: 판매량 집계 데이터의 판매원 이름을 나열한 배열
    :param amount: 판매량 집계 데이터의 판매 수량을 나열한 배열
    :return: 이익금
    """
    def set_parent_result(sell, money):
        """
        부모한테 10% 수익 나누기 - 재귀
        """
        if money <= 0:  # 돈이 0원이되면 끝내기
            return
        # 1. 부모가 있는 경우 부모에게 수익 배분 & 자신의 수익에서 배분한 금액만큼 빼기
        if parents[sell] != '-':
            answer[location[parents[sell]]] += int(money / 10)
            answer[location[sell]] -= int(money / 10)
            # 내 부모가 부모의 부모에게 수익 배분하기 위해 재귀 호출
            return set_parent_result(parents[sell], int(money / 10))
        else:
            # 2. 부모가 없는 경우고 센터한테만 수익 배분하고 끝 
            answer[location[sell]] -= int(money / 10)
            return

    answer = [0] * len(enroll)
    parents = dict()   # 자신의 부모
    location = dict()  # 자신의 위치
    # 자신의 부모와 자신의 위치를 입력
    for i, (en, refer) in enumerate(zip(enroll, referral)):
        parents[en] = refer
        location[en] = i
    # 판매자 별 부모에게 칫솔 수익 나눠주기
    for sell, count in zip(seller, amount):
        answer[location[sell]] += count * 100 # 칫솔 수익 추가
        set_parent_result(sell, count * 100)  # 부모한테 10% 떼어주기
    return answer

 


5. 결론

  • 재귀를 이용하여 부모에게 배분하는 함수만 짜면 쉬웠던 문제이다.
반응형