일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- windosw 문자열
- 재귀
- 암호수학
- c언어
- 미로 탐색 알고리즘
- level13
- ftz level13
- LoB
- 파이썬
- PHP
- 정렬 알고리즘
- 자료구조
- 파일 시스템
- 두근두근 자료구조
- Stack
- OSI
- HTML
- Java
- 시간복잡도
- War Game
- 스택
- web
- 백준
- windosws wbcs
- pwnable.kr
- System
- 큐
- SWiFT
- C
- ftz
Archives
- Today
- Total
나의 기록, 현진록
[Swift] 프로그래머스 레벨 3 다단계 칫솔 판매 본문
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/77486
1. 문제이해
- 판매원이 칫솔을 판매하면 피라미드 조직을 타고 조금씩 분배되는 형태의 판매망
- 판매원 마다 얼마의 수익을 가지는지 구하기
- 모든 판매원은 칫솔 판매로 발생하는 이익의 10%를 자신을 조직에 참여시킨 추천인에게 배분하고 나머지를 가짐
- 10%를 계산할 때 1원 미만은 무시
- 칫솔 개당 100원
2. 설계
- 조직 최상위인 center 를 제외한 모든 판매원은 부모 관계를 가짐
- 모든 판매원은 수수료를 부모에게 배분해야 함
- 판매 집계 데이터 요소마다 center까지 도달하며 수익을 배분하기
3. 코드
func solution(_ enroll:[String], _ referral:[String], _ seller:[String], _ amount:[Int]) -> [Int] {
var result = Array(repeating: 0, count: enroll.count) // 판매원의 총 수익
var dict = [String : Int]() // 이름 : index 딕셔너리
for (offset, name) in enroll.enumerated(){
dict[name] = offset
}
for i in 0..<seller.count{
let name = seller[i]
let cost = amount[i] * 100 // 수익
var pay = cost / 10 // 수수료
// 자식 먼저 돈 계산
let childIndex = dict[name]
result[childIndex!] += cost - pay // 수익의 10%를 빼고 나머지를 가짐
var parentName = referral[childIndex!]
while parentName != "-"{ // center에 도달할 때까지 계속
let parentIndex = dict[parentName]!
result[parentIndex] += pay - pay/10
parentName = referral[parentIndex] // 부모 이름 업데이트
pay /= 10
if pay <= 0{ break } // 10%가 1원 미만이면 더 이상 배분할 게 없음
}
}
return result
}
반응형
'Programming > Algorithm & Data Structure' 카테고리의 다른 글
[Swift] 백준골드4) 키 순서 (0) | 2024.12.31 |
---|---|
[Swift] 백준 골드4) 녹색 옷 입은 애가 젤다지? (0) | 2024.12.31 |
[Swift] 백준 타임머신 11657 (0) | 2024.12.18 |
[Swift] 백준 주사위 윷놀이 17825 (0) | 2024.12.10 |
[Swift] 백준 2116 주사위 쌓기 (0) | 2024.12.03 |