[アルゴリズム]プログラマ-機能開発


https://programmers.co.kr/learn/courses/30/lessons/42586
問題の説明
プログラマチームは機能強化を実行しています.各機能は、進捗が100%の場合にサービスに反映されます.
また、各機能の開発速度が異なるため、後の機能は前の機能の開発より先に、後の機能は前の機能の導入時に一緒に導入される可能性があります.
まず、ソリューション関数を完了し、特定の整数配列の進捗状況(必要に応じて配置される順序)と整数配列速度(タスクごとの開発速度)のときに、各配置にどれだけの機能があるかを返します.
せいげんじょうけん
  • タスクの数(進捗、速度配列長)は100を超えません.
  • 作業の進捗は100の自然数を下回っています.
  • の動作速度は100以下の自然数である.
  • 導入では、1日に1回しか導入できないと仮定し、1日の終了時に導入します.たとえば、開発の進捗状況が95%のタスクの速度が1日4%の場合、導入は2日後に完了します.
  • I/O例

    最初の機能は93%、毎日1%の作業を完了し、7日以内に導入を完了できます.
    2つ目の機能は30%を達成し、毎日30%の作業を完了できるため、3日間で導入を完了できます.ただし、前の機能はまだ完了していないため、最初の機能は導入の7日目に導入されます.
    3つ目の機能は55%を達成し、1日5%の作業を完了できるため、9日以内に導入を完了できます.
    これにより、7日目に2つの機能が導入され、9日目に1つの機能が導入されます.
    すなわち,後の機能は前の機能より先に配置することはできないので,与えられた配列順序を変えることはできない.
    function solution(progresses, speeds) {
        let leftDays = [];
        let answer = [];
        for(let i = 0 ; i < progresses.length; i++){
            leftDays.push(Math.ceil((100 - progresses[i]) / speeds[i]));
        }
        
        let countWorks = 1;
        let prevWork = leftDays[0];
        for(let i = 1 ; i < leftDays.length; i++){
            if(prevWork >= leftDays[i]){
                countWorks++;
            }else{
                prevWork = leftDays[i];
                answer.push(countWorks);
                countWorks = 1;
            }
        }
        
        answer.push(countWorks);
        
        return answer;
    }
    解答方法
    1.100%の残量から減算した値を各機能の動作速度でそれぞれ上げます.
    これは100%完成までの日数を求めるためです!
    2.leftDaysという名前の配列に各機能を完了するのに必要な日数を格納し、前からその配列をチェックし、配列の前の値が後の値より大きいか小さい場合に、同時に配置できる機能の個数をカウントします.
    最初に問題を見たとき、どうやって解くか分からなかったが、残りの日数を求める方法を考えてみると、10分もかからなかった.