코딩관계론

[웹 백엔드] 칫솔 판매 본문

개발/알고리즘

[웹 백엔드] 칫솔 판매

개발자_티모 2023. 4. 13. 02:05
반응형

문제 이해하기

판매원 A가 칫솔을 판매하면 판매한 금액의 10프로가 판매원 A의 상관인 B에게 분배되고, B의 상관인 C에게 분배되는 형태의 판매망을 운영하고 있습니다. 이 때 조직 내 누가 얼만큼의 이득을 가져갔는지 알고자하는 문제였습니다.

문제 해결 방법 설명하기

조직 내 누가 얼마만큼의 이득을 가져갔는지를 파악하기 위해서는 각 판매원이 판매한 금액을 추적해야 합니다. 예를 들어, 판매원 A가 100만원짜리 칫솔을 판매하면, A는 100만원의 10%인 10만원을 B에게, B는 10만원의 10%인 1만원을 C에게 주어야 합니다.

 

따라서 이 판매망에서 각 판매원이 얼마만큼의 이득을 가져가는지를 계산하려면, 각 판매원이 판매한 금액을 추적하고, 이를 기반으로 각 판매원이 상위 조직원에게 주는 이득을 계산하면 됩니다. 이러한 계산을 통해 각 판매원이 얼마만큼의 이득을 가져갔는지를 파악할 수 있습니다.

 

1. 판매원의 상관을 확인할 수 있어야 합니다.

 

다행이도 해당 문제에서는 한명의 판매원과 상관이 1대1로 매칭됩니다.

따라서 딕셔너리를 이용해 book[판매원] = 상관의 방식을 사용하면 판매원의 상관을 확인할 수 있습니다.

 

2. 판매원의 수입 계산 및 저장,  상관에게 10퍼센트의 수익을 전파할 수 있어야 합니다.

 

1번에 저장한 정보를 이용하면 판매자의 상관을 알 수 있고, 10퍼센트의 수익을 전달하면 됩니다.

각 판매원들의 수익을 저장하기 위해 딕셔너리를 사용할 수 있습니다. 

코드

def calc_share_earn(total_money_by_enroll, graph_map, enroll, earn_money):
    if enroll == '-' or earn_money == 0:
        return
    
    share_money = int(earn_money * 0.1)
    
    if share_money < 1:
        share_money = 0
    earn_money = earn_money - share_money
    # print(earn_money, enroll, earn_money, graph_map[enroll])
    
    total_money_by_enroll[enroll] += earn_money
    
    for parents in graph_map[enroll]:
        calc_share_earn(total_money_by_enroll, graph_map, parents, share_money)
   

def solution(enrolles, referral, seller, amount):
    answer = []
    
    graph_map = {}
    total_money_by_enroll = {}
    
    for enroll in enrolles:
        graph_map[enroll] = []
        total_money_by_enroll[enroll] = 0
        
    for child, parent in zip(enrolles, referral):
        graph_map[child].append(parent)
        
    for sell, count in zip(seller, amount):
        total_earn = count * 100
        calc_share_earn(total_money_by_enroll, graph_map, sell, total_earn)
    
    for enroll in enrolles:
        answer.append(total_money_by_enroll[enroll])
        
        
    return answer


if __name__ == "__main__":
    enroll = ["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"]
    referral = ["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"]
    seller = ["young", "john", "tod", "emily", "mary"]
    amount = [12, 4, 2, 5, 10]
    
    print(solution(enroll, referral, seller, amount))

 

코드 리뷰

def solution(enroll, referral, seller, amount):
    graph,ans = {},{e:0 for e in enroll}

    for e,r in zip(enroll,referral): graph[e]=r

    for s,a in zip(seller,amount):
        money = a*100
        rate = money//10
        ans[s] += money-rate
        x = graph[s]

        while x != "-":
            if rate==0: break
            ans[x] += rate-rate//10
            rate//=10
            x = graph[x]

    return list(ans.values())

 

배운점 정리하기

이번 코드 리뷰를 통해 배운 점은 다음과 같습니다.

  1. 문제 해결에 필요한 알고리즘을 선택하는 것이 중요합니다. 문제에서는 재귀를 사용할 필요가 없이 깔끔하게 구현할 수 있는 방법이 있었습니다. 따라서, 문제 해결 방법을 선택할 때는 재귀를 사용할 것인지, 루프를 사용할 것인지 등 여러 가지 방법 중 적절한 것을 선택해야 합니다.
  2. 가지치기를 잘하자는 것입니다. 가지치기를 하지 않으면 불필요한 연산이 많아져서 성능이 저하됩니다. 따라서, 문제 해결 방법에 따라 적절한 가지치기를 적용해야 합니다.
반응형