πŸ’†πŸ»‍♂️ ν”Ό-μ—μŠ€/🐣 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[μŠ€μœ„ν”„νŠΈ μ•Œκ³ λ¦¬μ¦˜] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€: κΈ°λŠ₯개발

κ°œλ°œν•˜λŠ” ν›ˆμ΄ 2021. 7. 31. 23:36

문제

문제 μ„€λͺ…

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ νŒ€μ—μ„œλŠ” κΈ°λŠ₯ κ°œμ„  μž‘μ—…μ„ μˆ˜ν–‰ μ€‘μž…λ‹ˆλ‹€. 각 κΈ°λŠ₯은 진도가 100%일 λ•Œ μ„œλΉ„μŠ€μ— λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

또, 각 κΈ°λŠ₯의 κ°œλ°œμ†λ„λŠ” λͺ¨λ‘ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 뒀에 μžˆλŠ” κΈ°λŠ₯이 μ•žμ— μžˆλŠ” κΈ°λŠ₯보닀 λ¨Όμ € 개발될 수 있고, μ΄λ•Œ 뒀에 μžˆλŠ” κΈ°λŠ₯은 μ•žμ— μžˆλŠ” κΈ°λŠ₯이 배포될 λ•Œ ν•¨κ»˜ λ°°ν¬λ©λ‹ˆλ‹€.

λ¨Όμ € λ°°ν¬λ˜μ–΄μ•Ό ν•˜λŠ” μˆœμ„œλŒ€λ‘œ μž‘μ—…μ˜ 진도가 적힌 μ •μˆ˜ λ°°μ—΄ progresses와 각 μž‘μ—…μ˜ 개발 속도가 적힌 μ •μˆ˜ λ°°μ—΄ speedsκ°€ μ£Όμ–΄μ§ˆ λ•Œ 각 λ°°ν¬λ§ˆλ‹€ λͺ‡ 개의 κΈ°λŠ₯이 λ°°ν¬λ˜λŠ”μ§€λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜μ„Έμš”.

 

μ œν•œ 사항

  • μž‘μ—…μ˜ 개수(progresses, speedsλ°°μ—΄μ˜ 길이)λŠ” 100개 μ΄ν•˜μž…λ‹ˆλ‹€.
  • μž‘μ—… μ§„λ„λŠ” 100 미만의 μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • μž‘μ—… μ†λ„λŠ” 100 μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • λ°°ν¬λŠ” ν•˜λ£¨μ— ν•œ 번만 ν•  수 있으며, ν•˜λ£¨μ˜ 끝에 이루어진닀고 κ°€μ •ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μ§„λ„μœ¨μ΄ 95%인 μž‘μ—…μ˜ 개발 속도가 ν•˜λ£¨μ— 4%라면 λ°°ν¬λŠ” 2일 뒀에 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

풀이

κ΅¬ν˜„ λ¬Έμ œμž…λ‹ˆλ‹€. μž‘μ—…μ„ ν•˜λ‚˜μ”© κΊΌλ‚΄κ°€λ©΄μ„œ ν•΄λ‹Ή μž‘μ—…μ΄ μ™„μ „νžˆ λλ‚˜λŠ” μ‹œκ°„ 내에 같이 λλ‚˜λŠ” μž‘μ—…λ“€μ„ λͺ©λ‘μ—μ„œ λΉΌμ€λ‹ˆλ‹€.

μ½”λ“œ

import Foundation

func finishJob (_ progresses : inout [Int], _ speeds: inout [Int]) -> Int{
    progresses.removeFirst()
    speeds.removeFirst()
    return 1
}

func calcDaysLeft (_ progresses : inout [Int], _ speeds: inout [Int]) -> Int {
    let funcNow = progresses.first!
    let timeLeft = 100 - funcNow
    
    return Int(ceil(Double(timeLeft) / Double(speeds.first!)))
}

func solution(_ progresses:[Int], _ speeds:[Int]) -> [Int] {
    var progs = progresses
    var spds = speeds
    var answer : [Int] = []
    
    while(!progs.isEmpty) {
        var finishCount = 0
        let currFuncDaysLeft = calcDaysLeft(&progs, &spds)
        finishCount += finishJob(&progs, &spds)
        
        for _ in 0..<progs.count {
            let nextFuncDaysLeft = calcDaysLeft(&progs, &spds)
            if (currFuncDaysLeft >= nextFuncDaysLeft) {
                finishCount += finishJob(&progs, &spds)
            }
        }
        answer.append(finishCount)
    }
    return answer
}