Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 쿠키
- 누적합
- 코드 계약
- docker
- 이분탐색
- 셀러리
- 레디스 동시성
- 좋은 코드 나쁜 코드
- 구현
- jwt 표준
- gRPC
- piplining
- 결제서비스
- AWS
- 수신자 대상 다르게
- 프로그래머스
- 트랜잭샨
- spring event
- 객체지향패러다임
- 알람 시스템
- 디버깅
- 카카오
- branch 전략
- 숫자 블록
- 백준
- 검색어 추천
- BFS
- 깊게 생각해보기
- 완전탐색
- prg 패턴
Archives
- Today
- Total
코딩관계론
[웹 백엔드] 칫솔 판매 본문
반응형
문제 이해하기
판매원 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())
배운점 정리하기
이번 코드 리뷰를 통해 배운 점은 다음과 같습니다.
- 문제 해결에 필요한 알고리즘을 선택하는 것이 중요합니다. 문제에서는 재귀를 사용할 필요가 없이 깔끔하게 구현할 수 있는 방법이 있었습니다. 따라서, 문제 해결 방법을 선택할 때는 재귀를 사용할 것인지, 루프를 사용할 것인지 등 여러 가지 방법 중 적절한 것을 선택해야 합니다.
- 가지치기를 잘하자는 것입니다. 가지치기를 하지 않으면 불필요한 연산이 많아져서 성능이 저하됩니다. 따라서, 문제 해결 방법에 따라 적절한 가지치기를 적용해야 합니다.
반응형
'개발 > 알고리즘' 카테고리의 다른 글
[프로그래머스] 과제 진행 (0) | 2023.05.07 |
---|---|
[프로그래머스] 요격 시스템 (0) | 2023.05.06 |
[카카오] k진수에서 소수 개수 구하기 (0) | 2023.04.11 |
[카카오] 표현 가능한 이진트리 (0) | 2023.04.11 |
[프로그래머스] 선입선출 (0) | 2023.03.24 |