나의 기록, 현진록

[Swift] 프로그래머스 레벨 3 다단계 칫솔 판매 본문

Programming/Algorithm & Data Structure

[Swift] 프로그래머스 레벨 3 다단계 칫솔 판매

guswlsdk 2025. 1. 7. 13:53
반응형

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
}

 

반응형