[プログラマ高得点Kit]スタック/キュープリンタ(level 2)


質問する


一般的なプリンタでは、必要な印刷順に印刷されます.したがって、重要なドキュメントは後で印刷される可能性があります.この問題を解決するために,重要文書を先に印刷するプリンタを開発した.この新しく開発されたプリンタは、次のように印刷されます.
印刷待ちリスト
  • から、先頭の文書(J)を取り出す.
  • 残りの
  • 個の印刷対象リストにJよりも重要なドキュメントがある場合は、Jを印刷対象リストの最後に配置します.
  • でなければJを印刷します.
    例えば、4つの文書(A、B、C、D)が印刷対象リストに順次存在し、重要度が2 1 3 2の場合、CD A Bの順に印刷される.
  • 私が印刷を要求したドキュメントが何回目の印刷なのか知りたいです.上記の例では、Cは1位、Aは3位である.
    ソリューション関数を作成してください.パラメータが現在のキュー・リスト内のドキュメントの重要度のソート順と、印刷を要求したドキュメントが現在のキュー・リスト内にある場所を指定した場合、印刷を要求したドキュメントの何回目の印刷かを返します.

    [制限]

  • 現在の待機リストには、1つ以上の100個のドキュメントが含まれています.
  • 印刷ジョブの重要性は1から9で表され、数字が大きいほど重要である.
  • の位置の値は0より大きく(現在のキューリストのタスク数-1)、キューリストの先頭に0、2番目の位置に1と表示されます.
  • [I/O例]



    I/O例説明
    例1
    問題の例は次のとおりです.
    例2
    6つの文書(A、B、C、D、E、F)は、印刷対象リストにおいて、重要度が1 1 1 1 9 1 1 1 1であり、C D E F A Bの順に印刷される.

    問題を解く


    コード1


    これはいくつかの方法で解決できる問題です.最初はいくつかの方法で解くのではなく、for文でもっと大きな値があるかどうかを探索し、いくつかの方法で問題を解決することができます.
    そして、locationの位置をどのように保存するかについて多くの問題を考え、他の怒りを晴らす方法を参考にして、以下のようにすることができます.
    function solution(priorities, location) {
        let answer;
        let order=location;
        let cnt=0; //인쇄된 것의 개수
        
        while(priorities.length){
            let compareNum=priorities.shift();
            if(priorities.some(x=>x>compareNum)) priorities.push(compareNum);
            else{
                cnt++;
                if(order===0){
                    answer=cnt;
                    return answer;
                }
            }
            if(order===0) order=priorities.length-1;
            else order--;
        }
        return answer;
    }

    コード2


    これは他の人の解答の中で最も推薦数の多い解答方法です.
    mapといくつかの方法で以下の説明を行うことができます.map関数を使うのはまだ硬いので難しいと思いますが、よく知っていれば、ずっと使っているかもしれません.
    function solution(priorities, location) {
        let answer;
        let list = priorities.map((v, i)=> ({
            my: i === location, val: v
        }));
        let count=0;
        while(true){
            let compareNum=list.shift();
            if(list.some(t=>t.val>compareNum.val)){
                list.push(compareNum);
            }
            else{
                count++;
                if(compareNum.my) return count;
            }
        }
        console.log(list);
        return answer;
    }

    整理する


    これはいくつかの方法を再学習できる問題です.また,以前学んだmap関数の復習も可能である.
    map関数もこの問題のように使えるなんて…!不思議

    リファレンス

  • メソッド
    https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/some
  • プールを参照
    https://kyoung-jnn.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8JavaScript-%ED%94%84%EB%A6%B0%ED%84%B0-%EC%8A%A4%ED%83%9D%ED%81%90