개발/알고리즘
[웹 백엔드] 칫솔 판매
개발자_티모
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())
배운점 정리하기
이번 코드 리뷰를 통해 배운 점은 다음과 같습니다.
- 문제 해결에 필요한 알고리즘을 선택하는 것이 중요합니다. 문제에서는 재귀를 사용할 필요가 없이 깔끔하게 구현할 수 있는 방법이 있었습니다. 따라서, 문제 해결 방법을 선택할 때는 재귀를 사용할 것인지, 루프를 사용할 것인지 등 여러 가지 방법 중 적절한 것을 선택해야 합니다.
- 가지치기를 잘하자는 것입니다. 가지치기를 하지 않으면 불필요한 연산이 많아져서 성능이 저하됩니다. 따라서, 문제 해결 방법에 따라 적절한 가지치기를 적용해야 합니다.
반응형