プログラマーコード問題2020年/11/05-Lv.2プリンタ


[質問]


一般的なプリンタでは、必要な印刷順に印刷されます.したがって、重要なドキュメントは後で印刷される可能性があります.この問題を解決するために,重要文書を先に印刷するプリンタを開発した.この新しく開発されたプリンタは、次のように印刷されます.
印刷待ちリスト
  • から、先頭の文書(J)を取り出す.
  • 残りの
  • 個の印刷対象リストにJよりも重要なドキュメントがある場合は、Jを印刷対象リストの最後に配置します.
  • でなければJを印刷します.
    例えば、4つの文書(A、B、C、D)が印刷対象リストに順次存在し、重要度が2 1 3 2の場合、CD A Bの順に印刷される.
  • 私が印刷を要求したドキュメントが何回目の印刷なのか知りたいです.上記の例では、Cは1位、Aは3位である.
    ソリューション関数を作成してください.パラメータが現在のキュー・リスト内のドキュメントの重要度のソート順と、印刷を要求したドキュメントが現在のキュー・リスト内にある場所を指定した場合、印刷を要求したドキュメントの何回目の印刷かを返します.
    せいげんじょうけん
    現在のキュー・リストには、100個未満の1つ以上のドキュメントが含まれています.
    印刷ジョブの重要性は1~9で表され、数字が大きいほど重要です.
    locationには0未満の値(現在のキューリストのタスク数-1)があり、キューリストの一番前にある場合は0、2番目にある場合は1と表示されます.
    I/O例
    priorities
    location
    return
    [2, 1, 3, 2]
    2
    1
    [1, 1, 9, 1, 1, 1]
    0
    5
    例1
    問題の例は次のとおりです.
    例2
    6つの文書(A、B、C、D、E、F)は、印刷対象リストにおいて、重要度が1 1 1 1 9 1 1 1 1であり、C D E F A Bの順に印刷される.

    [回答]

    function solution(priorities, location) {
      let count = 0;
      let maxNum = 0;
      let maxNumIndex = 0;
      const resortedArr = priorities.map((num, idx) => ({idx, num}));
    
      while(true) {
        maxNum = 0;
        resortedArr.forEach(el => maxNum = el.num > maxNum ? el.num : maxNum);
        maxNumIndex = resortedArr.findIndex(el => el.num === maxNum);
        const tempArr = [...resortedArr];
        const tempArr2 = tempArr.splice(0, maxNumIndex);
    
        resortedArr.splice(0, resortedArr.length);
        resortedArr.push(...tempArr.concat(tempArr2));
    
        count += 1;
    
        if(resortedArr.shift().idx === location) return count;
      }
    }
    優先度の低いものを後で送信すると、indexを混合したり、indexを一緒に管理したりすることができます.indexvalueを持つようにオブジェクトを作成します.indexlocationが同じなら.
    抽出された順序はreturnであった.