[Java]スタック/キュープリンタ

17081 ワード

問題の説明


一般的なプリンタでは、必要な印刷順に印刷されます.したがって、重要なドキュメントは後で印刷される可能性があります.この問題を解決するために,重要文書を先に印刷するプリンタを開発した.この新しく開発されたプリンタは、次のように印刷されます.
印刷待ちリストから一番前のドキュメント(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例


prioritieslocationreturn[2, 1, 3, 2]21[1, 1, 9, 1, 1, 1]05

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の順に印刷される.

反省する


スタックやキューにはあまり向いていないような気がします.
maxで条件文を適用するはずだったが、idx[i]>=idx[i+1]という比較でアクセスしようとした.
count : answer, location
問題のタイプに応じて構造を把握します.-
while
if
if
break
else

パイソンが問題を解く

def solution(priorities, location):
    answer = 0
 
    while len(priorities) > 0:
        if priorities[0] == max(priorities):  # 우선순위 확인
            # 맨 앞 문서 인쇄
            priorities.pop(0)
            answer += 1
            if location == 0:  # 요청한 문서이면 반복문 종료
                break
        else:
            # 맨 앞 문서를 대기 목록의 가장 마지막에 추가
            priorities.append(priorities.pop(0))
        location = location - 1 if location > 0 else len(priorities) - 1  # 요청 문서 위치 변경
    return answer

Javaの解題


優先キューソース

import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
        int answer = 0;
        
        for (int i = 0; i < priorities.length; i++) {
            pq.add(priorities[i]);
        }
        
        while (!pq.isEmpty()) {
            for (int i = 0; i < priorities.length; i++) {
                if (priorities[i] == pq.peek()) {
                    if (i == location) {
                        answer++;
                        return answer;
                    }
                    pq.poll();
                    answer++;
                }
            }
        }
        return -1;
    }
}

キューソース

import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        Queue<Pair> queue = new LinkedList<>();
        int answer = 0;
        
        for (int i = 0; i < priorities.length; i++) {
            queue.add(new Pair(i, priorities[i]));
        }
        
        while (!queue.isEmpty()) {
            
            int current = queue.peek().value;
            
            boolean flag = false;
            
            for (Pair pair : queue) {
                if (pair.value > current) {
                    // System.out.println(pair.value);
                    flag = true;
                    break;
                }
            }
            
            if (flag) {
                Pair temp = queue.poll();
                queue.add(temp);
            }
            else {
                answer++;
                Pair pair = queue.poll();
                
                if (pair.index == location) {
                    return answer;
                }
            }
        }
        return answer;
    }
    
    class Pair {
        int index;
        int value;
        
        public Pair(int index, int value) {
            this.index = index;
            this.value = value;
        }
    }
}