[programmers]level 2-機能開発(lang:swift)


機能開発
問題の説明
プログラマチームは機能強化を実行しています.各機能は、進捗が100%の場合にサービスに反映されます.
また、各機能の開発速度が異なるため、後の機能は前の機能の開発より先に、後の機能は前の機能の導入時に一緒に導入される可能性があります.
まず、ソリューション関数を完了し、特定の整数配列の進捗状況(必要に応じて配置される順序)と整数配列速度(タスクごとの開発速度)のときに、各配置にどれだけの機能があるかを返します.
せいげんじょうけん
タスクの数(進捗、速度配列の長さ)は100個を超えません.
作業の進捗は100未満の自然数です.
動作速度が100以下の自然数.
導入は1日に1回しか行われず、1日の終了時に完了すると仮定します.たとえば、開発の進捗状況が95%のタスクの速度が1日4%の場合、導入は2日後に完了します.
I/O例
progresses	speeds	return
[93, 30, 55]	[1, 30, 5]	[2, 1]
[95, 90, 99, 99, 80, 99]	[1, 1, 1, 1, 1, 1]	[1, 3, 2]
I/O例説明
I/O例#1
最初の機能は93%、毎日1%の作業を完了し、7日以内に導入を完了できます.
2つ目の機能は30%を達成し、毎日30%の作業を完了できるため、3日間で導入を完了できます.ただし、前の機能はまだ完了していないため、最初の機能は導入の7日目に導入されます.
3つ目の機能は55%を達成し、1日5%の作業を完了できるため、9日以内に導入を完了できます.
これにより、7日目に2つの機能が導入され、9日目に1つの機能が導入されます.
I/O例#2
すべての機能は1日1%のタスクしか達成できないため、タスクが終了するまでの残りの日数はそれぞれ5日、10日、1日、1日、20日、1日です.前のすべての機能が完了していない場合は、機能を導入できません.
これにより、5日目に1つの機能、10日目に3つの機能、20日目に2つの機能が導入されます.
※公告-2010年7月14日にテストケースを追加しました.
=================================================================
  • 私が書いたコード
  • import Foundation
    
    /*
     progresses    speeds    return
     [93, 30, 55]    [1, 30, 5]    [2, 1]
     [95, 90, 99, 99, 80, 99]    [1, 1, 1, 1, 1, 1]    [1, 3, 2]
     */
    
    func solution(_ progresses:[Int], _ speeds:[Int]) -> [Int] {
        var count = 0
        var result: [Int] = []
        var tempProgresses: [Int] = progresses
        var tempSpeeds: [Int] = speeds
        while(!tempProgresses.isEmpty){
            for checkIndex in 0...tempProgresses.count-1{
                if tempProgresses[checkIndex] < 100 {
                    break
                } else {
                    count += 1
                }
            }
            for index in 0...tempProgresses.count-1 {
                if count > 0 {
                    result.append(count)
                    for _ in 0...count-1{
                        tempProgresses.remove(at: 0)        // queue pop
                        tempSpeeds.remove(at: 0)
                    }
                    count = 0
                    break
                } else {
                    tempProgresses[index] += tempSpeeds[index]
                }
            }
        }
        return result
    }
  • 他者コード
  • import Foundation
    
    func solution(_ progresses:[Int], _ speeds:[Int]) -> [Int] {
        return zip(progresses, speeds)
            .map { (100 - $0) / $1 }
            .reduce(([], 0)) { (tuple, day) -> ([Int], Int) in
                let (list, lastMax) = tuple
                guard let lastCount = list.last else {
                    return ([1], day)
                }
                if lastMax >= day {
                    return (list.dropLast() + [lastCount + 1], lastMax)
                }
                return (list + [1], day)
            }.0
    }