基本情報技術者試験 科目Bの「令和4年度(12月公開) サンプル問題 問8」(優先度付きキュー・PrioQueue)を、図解トレースで解説します。出力されるタイミングさえ間違わなければ、確実に得点できるチャンス問題です。
動画で見たい方はこちら▼
解く前に:オブジェクト指向(クラス)が不安な人へ
この問題はクラス(メソッド)を使う優先度付きキューが題材です。クラスやメソッドの読み方に自信がない人は、先にこちらで基礎を固めてください。
問題(令和4年度 サンプル問題 問8)
次の記述中の【 】に入れる正しい答えを、解答群の中から選べ。
優先度付きキューを操作するプログラムである。優先度付きキューとは扱う要素に優先度を付けたキューであり、要素を取り出す際には優先度の高いものから順番に取り出される。クラス PrioQueue は優先度付きキューを表すクラスである。クラス PrioQueue の説明を図に示す。ここで、優先度は整数型の値 1、2、3 のいずれかであり、小さい値ほど優先度が高いものとする。
手続 prioSched を呼び出したとき、出力は【 】の順となる。
【コンストラクタ】
| コンストラクタ | 説明 |
|---|---|
| PrioQueue() | 空の優先度付きキューを生成する。 |
【メソッド】
| メソッド名 | 戻り値 | 説明 |
|---|---|---|
| enqueue(文字列型: s, 整数型: prio) | なし | 優先度付きキューに、文字列 s を要素として、優先度 prio で追加する。 |
| dequeue() | 文字列型 | 優先度付きキューからキュー内で最も優先度の高い要素を取り出して返す。最も優先度の高い要素が複数あるときは、そのうちの最初に追加された要素を一つ取り出して返す。 |
| size() | 整数型 | 優先度付きキューに格納されている要素の個数を返す。 |
〔プログラム〕
○prioSched()
PrioQueue:prioQueue ← PrioQueue()
prioQueue.enqueue("A",1)
prioQueue.enqueue("B",2)
prioQueue.enqueue("C",2)
prioQueue.enqueue("D",3)
prioQueue.dequeue() /* 戻り値は使用しない */
prioQueue.dequeue() /* 戻り値は使用しない */
prioQueue.enqueue("D",3)
prioQueue.enqueue("B",2)
prioQueue.dequeue() /* 戻り値は使用しない */
prioQueue.dequeue() /* 戻り値は使用しない */
prioQueue.enqueue("C",2)
prioQueue.enqueue("A",1)
while(prioQueue.size() が 0 と等しくない)
prioQueue.dequeue() の戻り値を出力
endwhile
解答群
ア ”A”, “B”, “C”, “D”
イ ”A”, “B”, “D”, “D”
ウ ”A”, “C”, “C”, “D”
エ ”A”, “C”, “D”, “D”
解説
正解は エ です。
①最初の4つの enqueue を反映
prioQueue.enqueue("A", 1)
prioQueue.enqueue("B", 2)
prioQueue.enqueue("C", 2)
prioQueue.enqueue("D", 3)
| 優先度 | 1 | 2 | 2 | 3 |
|---|---|---|---|---|
| 文字列 | A | B | C | D |
②続く2つの dequeue(戻り値は使わない)。優先度の高いもの=小さい値から取り出されるので、A(優先度1)、B(優先度2、同優先度内で最初に入った) の順に取り出されます。
| 優先度 | 1 | 2 | 2 | 3 |
|---|---|---|---|---|
| 文字列 | C | D |
なお、「/ 戻り値は使用しない /」とあるとおり、デキューされた値(戻り値)は出力として使われない点に注意です。
③enqueue(“D”, 3)、enqueue(“B”, 2) を追加すると以下。
| 優先度 | 2 | 3 | 3 | 2 |
|---|---|---|---|---|
| 文字列 | C | D | D | B |
④さらに dequeue が2回。優先度2が一番高いので、C と B が候補です。FIFO ルールにより 最初に追加された C → 次に B の順で取り出されます(両方とも戻り値は使わない)。
| 優先度 | 2 | 3 | 3 | 2 |
|---|---|---|---|---|
| 文字列 | D | D |
⑤enqueue(“C”, 2)、enqueue(“A”, 1) を追加。
| 優先度 | 3 | 3 | 2 | 1 |
|---|---|---|---|---|
| 文字列 | D | D | C | A |
⑥while ループで、size が 0 になるまで dequeue の戻り値を出力します。残っているのは D(3)、D(3)、C(2)、A(1)。優先度が高い順(値の小さい順)に取り出すと:
| 取り出し順 | 優先度 | 文字列 | 出力 |
|---|---|---|---|
| 1 | 1 | A | “A” |
| 2 | 2 | C | “C” |
| 3 | 3 | D(先に追加された方) | “D” |
| 4 | 3 | D | “D” |
出力順は A, C, D, D(エ)です。
Memo: 「戻り値を使わない dequeue」の取り出し値は出力されない
このプログラムは while の前にも4回 dequeue を呼んでいますが、それらは /* 戻り値は使用しない */ のコメント付き。そこで取り出された値は 出力されません。出力されるのは、while ループの中で「size が 0 になるまで」取り出した dequeue の戻り値だけです。前半の dequeue を出力に含めないよう注意しましょう。
まとめ
優先度付きキューは 「優先度の小さい値から、同優先度内は FIFO」 の2ルールだけで動きを追えます。dequeue の中でも「戻り値を使う/使わない」の区別が、出力に含めるかどうかを決めるポイントです。
関連リンク

関連動画
スタック/キューの基礎から学べる、同じ章の動画です。
講座の全動画はこちら(プレイリスト)。
