基本情報【科目B】令和4年度サンプル問題問8(優先度付きキュー):罠は「戻り値を使わないdequeue」

基本情報技術者試験 科目Bの「令和4年度(12月公開) サンプル問題 問8」(優先度付きキュー・PrioQueue)を、図解トレースで解説します。出力されるタイミングさえ間違わなければ、確実に得点できるチャンス問題です。

動画で見たい方はこちら▼

解く前に:オブジェクト指向(クラス)が不安な人へ

この問題はクラス(メソッド)を使う優先度付きキューが題材です。クラスやメソッドの読み方に自信がない人は、先にこちらで基礎を固めてください。

404 NOT FOUND | MOSの学校

問題(令和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
文字列 A B 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
文字列 C D D B

⑤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 の中でも「戻り値を使う/使わない」の区別が、出力に含めるかどうかを決めるポイントです。

関連リンク

基本情報科目B-サンプル問題【全44問をがっつり解説】
※一部、執筆途中です。随時アップしていきます。 ※サンプル問題だけを解くのは,非効率です。詳細は以下の動画をご確認ください。 読者限定プレゼント 科目B 演習サイトを無料プレゼント中 ⏱ 2分で終わるアンケートに答えるだけ! ▶ 演習サイト...

関連動画

スタック/キューの基礎から学べる、同じ章の動画です。

講座の全動画はこちら(プレイリスト)。


無料YouTube講座

科目Bを88問で攻略する講座

サンプル問題だけでは足りない。出題パターンを体系的に。

▶ 講座を見る(無料)

読者限定プレゼント

科目B 演習サイトを無料プレゼント中

⏱ 2分で終わるアンケートに答えるだけ!


科目B 演習サイト

▶ 演習サイトを受け取る(無料)

※ Googleフォーム(SSL)に移動します

タイトルとURLをコピーしました