[Swift - ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 닀단계 칫솔 판맀

2021. 6. 2. 17:50γ†πŸ§‘πŸ»‍πŸ’» iOS 개발/Swift - Algorithm - Solutions

πŸ•΅πŸ»  λ¬Έμ œ 해석 


λ―Όν˜ΈλŠ” 닀단계 쑰직으둜 칫솔을 νŒλ§€ν•˜λŠ” 사업을 ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 ν”ΌλΌλ―Έλ“œ μ‹μ˜ 쑰직은 νŒλ§€μ›μ΄ 칫솔을 νŒλ§€ν•˜μ˜€μ„ λ•Œ, κ·Έ 수읡금의 10%λ₯Ό μžμ‹ μ„ μ†Œκ°œν•΄μ€€ νŒλ§€μ›μ—κ²Œ λΆ„λ°°ν•©λ‹ˆλ‹€. 뢄배받은 νŒλ§€μ›λ„ λˆ„κ΅°κ°€μ˜ μ†Œκ°œλ₯Ό λ°›μ•˜μ—ˆλ‹€λ©΄ 뢄배받은 κΈˆμ•‘μ˜ 10%와 μžμ‹ μ˜ 수읡금 10%을 λ§ˆμ°¬κ°€μ§€λ‘œ λΆ„λ°°ν•©λ‹ˆλ‹€. 이런 μ‹μœΌλ‘œ λͺ¨λ“  νŒλ§€μ›μ˜ μˆ˜μ΅κΈˆμ„ μ •μ‚°ν•˜μ˜€μ„ λ•Œ, κ·Έ κΈˆμ•‘μ„ λ¦¬ν„΄ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€. 

λ¬Έμ œμ—μ„œ μ œκ³΅ν•˜λŠ” μ˜ˆμ‹œλ₯Ό λ΄…μ‹œλ‹€!

νŒλ§€μ› 판맀 μˆ˜λŸ‰ 수읡금
young 12 1,200원
john 4 400원
tod 2 200원
emily 5 500원
mary 10 1,000원

 

λ¬Έμ œμ—μ„œ 주어진 수읡금과 μ†Œκ°œ ꡬ쑰λ₯Ό λ°”νƒ•μœΌλ‘œ 쑰직도λ₯Ό κ·Έλ €λ΄€μŠ΅λ‹ˆλ‹€. νŒŒλž€μƒ‰μœΌλ‘œ 칠해진 μ‚¬κ°ν˜•λ“€μ€ 칫솔을 νŒλ§€ν•˜μ—¬ 수읡금이 λ°œμƒν•œ νŒλ§€μ›λ“€μ„ ν‘œμ‹œν•œ κ²ƒμž…λ‹ˆλ‹€. νŒλ§€μ›μ—κ²Œ μ†Œκ°œ μ‹œμΌœμ€€ μ‚¬λžŒμ€ ν•œ λͺ…μ΄λ―€λ‘œ 트리ꡬ쑰라고 λ³Ό 수 있겠죠? 

λ”°λΌμ„œ νŒŒλž€μƒ‰μœΌλ‘œ μΉ ν•œ νŒλ§€μ›λ“€λ‘œ λΆ€ν„° λ°œμƒν•˜λŠ” λΆ„λ°°κΈˆμ„ 센터에 도달할 λ•ŒκΉŒμ§€ 계속 10%둜 κ³„μ‚°ν•˜μ—¬ μ „λ‹¬ν•˜λ©΄ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆκ² μŠ΅λ‹ˆλ‹€. 

πŸ€” 풀이 κ³Όμ •


이제 트리ꡬ쑰인 것을 μ•Œκ² κ³  λ”°λ‘œ node classλ₯Ό λ§Œλ“€μ–΄μ„œ μ ‘κ·Όν•΄λ³΄λ €ν–ˆμœΌλ‚˜ λ”•μ…”λ„ˆλ¦¬λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 더 κ°„νŽΈν•œ 것 κ°™μ•„μ„œ νŒλ§€μ›κ³Ό μΆ”μ²œμΈμ„ λ§€μΉ­μ‹œμΌœμ€„ connections λ”•μ…”λ„ˆλ¦¬μ™€, νŒλ§€μ›κ³Ό μˆ˜μ΅κΈˆμ„ μ €μž₯ν•  profits λ”•μ…”λ„ˆλ¦¬, 이 두 가지λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

μ œκ°€ 문제λ₯Ό ν’€λ©΄μ„œ κ°€μž₯ ν—·κ°ˆλ Έλ˜ 뢀뢄은 "수읡이 λ°œμƒν•œ 단 ν•˜λ‚˜μ˜ λ…Έλ“œλ‘œλΆ€ν„° λΆ€λͺ¨ λ…Έλ“œλ₯Ό 따라 κ³„μ‚°ν•œ λΆ„λ°°κΈˆλ§Œμ„ μ „λ‹¬ν•œλ‹€"λΌλŠ” λΆ€λΆ„μ΄μ—ˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μœ„μ˜ 트리 ꡬ쑰λ₯Ό 보면 Mary처럼 μžμ‹ λ…Έλ“œκ°€ μ—¬λŸ¬ 개인 경우 전달받은 λΆ„λ°°κΈˆ λ˜ν•œ μ—¬λŸ¬ κ°œκ°€ λ©λ‹ˆλ‹€.

μ΄λ•Œ, (뢄배받은 κΈˆμ•‘λ“€μ˜ ν•© + μžμ‹ μ˜ 수읡금)의 10%λ₯Ό  μ„Όν„°μ— μ „λ‹¬ν•˜λŠ” 것이 μ•„λ‹Œ, [young, emily, tod]λ“€λ‘œλΆ€ν„° λΆ„λ°°λœ κΈˆμ•‘λ§ˆλ‹€ λ”°λ‘œ 10%μ”© μ²˜λ¦¬ν•˜μ—¬ 전달해야 ν•œλ‹€λŠ” 것이 λ¬΄μ²™μ΄λ‚˜ ν—·κ°ˆλ ΈμŠ΅λ‹ˆλ‹€.

그럼 μœ„μ˜ λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ 트리 νƒμƒ‰μ˜ μ‹œμž‘μ μ€ 판맀 수읡이 λ°œμƒν•œ [young, john, tod, emily, mary]κ°€ 될 것이고 각각의 탐색 μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • young - edward - mary - center
  • john - center
  • tod - jaymie - mary - center
  • emily - mary - center
  • mary - center

λ”°λΌμ„œ, 수읡이 λ°œμƒν•œ λ…Έλ“œλ“€μ—μ„œ center에 도달할 λ•ŒκΉŒμ§€ λΆ„λ°°κΈˆμ„ 전달할 μž¬κ·€ ν•¨μˆ˜λ₯Ό 각각 ν˜ΈμΆœν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. 

μ΄λ•Œ, μž¬κ·€ ν•¨μˆ˜μ—μ„œ 전달할 λΆ„λ°°κΈˆμ΄ 0이 되면 μ „λ‹¬ν•˜λŠ” μ˜λ―Έκ°€ 더 이상 μ—†μœΌλ―€λ‘œ 리턴 처리λ₯Ό ν•΄μ£Όμ–΄ μ‹œκ°„μ„ μ’€ 더 단좕할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“¦  λ¬Έμ œ 풀이 & μ½”λ“œ


import Foundation

func solution(_ enroll:[String], _ referral:[String], _ seller:[String], _ amount:[Int]) -> [Int] {
    // [νŒλ§€μ› : μΆ”μ²œμΈ] , [νŒλ§€μ› : 수읡금]
    var connections = Dictionary<String, String>()
    var profits = Dictionary<String, Int>()
    profits["-"] = 0
    
    // λΆ„λ°°κΈˆ 계산, Int μƒμ„±μžλ‘œ μ ˆμ‚¬ 처리
    func calculate(_ profit: Int) -> Int {
        return Int(Double(profit) * 0.1)
    }

    // λΆ„λ°°κΈˆ 전달 ν•¨μˆ˜
    func pass(_ name: String, earn: Int) {
        // λΆ„λ°°κΈˆμ΄ 0에 μˆ˜λ ΄ν•˜λ©΄ 더 이상 μ „λ‹¬ν•˜λŠ” μ˜λ―Έκ°€ μ—†μœΌλ―€λ‘œ, return
        if earn == 0 {
            return
        }
        
        // λΆ„λ°°κΈˆ 전달
        profits[name]! += earn
        if name != "-" {
            // μžμ‹ μ„ μΆ”μ²œν•œ μΆ”μ²œμΈμ΄ μ‘΄μž¬ν•˜λ©΄ 10%λ₯Ό μ œν•œ κΈˆμ•‘μ€ 가지고 λΆ„λ°°κΈˆμ„ λ„˜κΈ΄λ‹€.
            profits[name]! -= calculate(earn)
            pass(connections[name]!, earn: calculate(earn))
        }
    }
    
    // λ”•μ…”λ„ˆλ¦¬ μ΄ˆκΈ°ν™”
    for i in 0..<enroll.count {
        connections[enroll[i]] = referral[i]
        profits[enroll[i]] = 0
    }
    
    // 수읡금이 λ°œμƒν•œ λ…Έλ“œλ“€λ‘œ λΆ€ν„° λΆ„λ°°κΈˆμ„ λ¨Όμ € κ³„μ‚°ν•˜κ³  μžμ‹ μ˜ 판맀 μˆ˜μ΅μ„ 더해 μ€€λ‹€.
    for i in 0..<seller.count {
        pass(connections[seller[i]]!, earn: calculate(amount[i] * 100))
        // 이미 λΆ„λ°°λ₯Ό ν•΄μ€€ μƒν™©μ΄λ―€λ‘œ 100 * 0.9 = 90
        profits[seller[i]]! += amount[i] * 90
    }
   
    // enroll μž…λ ₯ μˆœμ„œλŒ€λ‘œ μˆ˜μ΅κΈˆμ„ 맀핑
    return enroll.map{profits[$0]!}
}
 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - 닀단계 칫솔 판맀

λ―Όν˜ΈλŠ” 닀단계 쑰직을 μ΄μš©ν•˜μ—¬ 칫솔을 νŒλ§€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. νŒλ§€μ›μ΄ 칫솔을 νŒλ§€ν•˜λ©΄ κ·Έ 이읡이 ν”ΌλΌλ―Έλ“œ 쑰직을 타고 μ‘°κΈˆμ”© λΆ„λ°°λ˜λŠ” ν˜•νƒœμ˜ νŒλ§€λ§μž…λ‹ˆλ‹€. μ–΄λŠμ •λ„ νŒλ§€κ°€ 이루어진 ν›„,

programmers.co.kr