プログラマアルゴリズムプリンタ


プログラマー練習問題
プログラマレベル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例



    📄🤔 コードと解釈プロセス


    🔹 1番

    public static int solution(int[] priorities, int location) {
        
    	Queue<Integer> q = new LinkedList<>();
            for (int i : priorities) {
                q.add(i);           
            }
    
            Integer[] arr = new Integer[priorities.length];
            for (int i = 0; i < priorities.length; i++) {
                arr[i] = priorities[i];
            }
    
            int count = 0;
            Arrays.sort(arr, Collections.reverseOrder());
    
            out:
            for (int i = 0; i < arr.length; i++) {
                while(true) {
                    if(arr[i] == q.peek()) {
                        q.remove();
                        count++;                    
                        location--;
                        if(location==-1) break out;
                        break;
                    }else {
                        q.add(q.poll());
                        location--;
                        if(location==-1) location = q.size()-1;
                    }
                }
            }
    
            return count;
    }

    🔸 1号解


    最初のコードは
    FIFO属性を持つキューに既存のプリンタキューを入れます.
    Arrays.sortとCollections.reverseOrder()
    既存のプリンタキューを降順に並べたarr配列が作成されました.
    降順配列を作成する理由は
    優先度の高い
    優先度の高いプリンタのリストからソートします.
    最初のキューに入った値と比較して、配列の最初の値が一致します.
    印刷してキューから削除し、
    そうでない場合は、キューから削除し、キューの最後に挿入します.
    for繰り返し文は、配列された配列を降順に回転させる.
    キューには、優先度の高いタスクに遭遇するまでwhile文が表示されません.
    発生した場合、count(出力を記録するドキュメント数)をキューから削除します.
    locationを減らす理由は
    この問題は場所の最初のドキュメントです
    これは、数回目の出力を返さなければならない問題のためです.
    前のドキュメントが出力または後退するたびに、locationの2番目のドキュメントのlocation値(位置インデックス値)は1減少します.
    印刷するドキュメントを印刷すると、
    if(location=-1)breakoutで名前付きfor反復文を終了し、現在の出力数を返します.
    locationが-1の場合、優先度は残りのドキュメントより低いです.
    出力できません.
    ドア内部のelseでは
    (location==1)location=q.size()の場合-1
    location値は、キューの最後の場所のインデックスです.
    キューの最後に追加されます.
    Integerタイプのアレイを作成する理由は、次のとおりです.
    Arrays.sort()を使用して比較測定プログラムを使用する場合
    int配列をソートできません.Integer配列に入れてください.
    降順に並べられています.
    このようにして問題を解くことができた.
    並べ替え用のスマートアレイを作成する際の無駄な処理と
    繰り返し文に名前を付けて、離れる方法
    そんなに効率的で清潔に見えないからです.
    さらなる修正をしました.

    🔹 2番

    public static int solution(int[] priorities, int location) {
        
        Queue<Integer> q = new LinkedList<>();
        for (int i : priorities) {
        	q.add(i);			
        }
        
        int count = 0;
        Arrays.sort(priorities);
    
        for (int i = priorities.length-1; i >= 0 ; i--) {
    	while(true) {
        		location--;
    		if(priorities[i] == q.peek()) {
    			q.remove();
    			count++;					
    			if(location==-1) return count;
    			break;
    		}else {
    			q.add(q.poll());
    			if(location==-1) location = q.size()-1;
    		}
    	}
        }
        
        return count;
    }

    🔸 第二題


    1番コードに降順に並べ、比較計測器を使用します.
    Integerアレイが作成されました.
    でも考えてみればsortで昇順ソートします.
    配列の後ろから繰り返し文に値を入力します.
    よくわからない
    優先順位をもたらすという考えが生まれた.
    これにより、スマートアレイを削除し、優先順位順にアレイを昇順にソートできます.
    forドアを後ろから回します.
    また、(location==-1)が中断した場合.
    外部反復文から終了して戻ります.
    if(location==-1) return count;
    直接countに戻り、メソッドを終了に変更します.
    いずれにしても外部の複文が終わった後に戻るだけです.
    外部の繰り返し文が終了したときだけ
    返品した方がいいと思うからです.
    location
    どうせwhileドアを回すたびに運行します
    中伏だと思って、条件文の一行を削除しました.
    これは大規模なデータを処理する問題ではありません.
    コミット時の処理速度は大幅に低下しなかった.
    最初のコードよりずっと簡潔です.

    😳❕ 感想&感想


    Q今回初めて利用しました.
    理論を勉強するときに例として使ったことがありますが.
    問題解決に実際に応用したのは初めてです.
    私は勉強しかしていないので、よく書いたことがありません.
    この問題は少し骨が折れる.
    しかし、私は自分で書いて、どんな方法があるか振り返ってみました.
    各メソッドの機能または戻り値をチェックして使用します.
    私のことが少しできるようです.
    List, Set, Map, Queue, Stack...
    詳しくはこれら以外にもたくさんのコレクションがあります.
    問題が発生した場合は、適切な場所に使用します.
    効率的に問題を解決できる開発者になる.
    コレクションをより頻繁に使用する:)