基本情報技術者試験 科目B サンプル問題 問8の解説|優先度付きキュー PrioQueue の出力順

基本情報技術者試験

科目B サンプル問題 問8難易度 ★★擬似言語・クラスとメソッド・キュー最終更新 2026-09-22

キューに入れる・取り出すを並べただけのプログラムで、キューの中身を1行ずつ書き出していけば解けます。気をつけるのは2点 ── 途中で取り出したものは出力されないこと、最後に残ったものは入れた順ではなく優先度の順に出ることです。

難易度 ★★(当サイトの目安)── メソッドの説明を読み、出し入れを順に表で追う。一本道だが回数が多い。4段階の決め方は科目B 最短合格の戦略にあります。

出題

出典:基本情報技術者試験 科目B サンプル問題 問8

次の記述中の   に入れる正しい答えを,解答群の中から選べ。

優先度付きキューを操作するプログラムである。優先度付きキューとは扱う要素に優先度を付けたキューであり,要素を取り出す際には優先度の高いものから順番に取り出される。クラスPrioQueue は優先度付きキューを表すクラスである。クラスPrioQueue の説明を図に示す。ここで,優先度は整数型の値1,2,3 のいずれかであり,小さい値ほど優先度が高いものとする。

手続prioSched を呼び出したとき,出力は   の順となる。

コンストラクタ PrioQueue() … 空の優先度付きキューを生成する。

メソッド enqueue(文字列型: s, 整数型: prio) 戻り値:なし … 優先度付きキューに,文字列s を要素として,優先度prio で追加する。

メソッド dequeue() 戻り値:文字列型 … 優先度付きキューからキュー内で最も優先度の高い要素を取り出して返す。最も優先度の高い要素が複数あるときは,そのうちの最初に追加された要素を一つ取り出して返す。

メソッド size() 戻り値:整数型 … 優先度付きキューに格納されている要素の個数を返す。

図 クラスPrioQueue の説明(原本は表。当サイトで1行ずつに並べ直しました。字句は変えていません)

〔プログラム〕

○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”

答えだけ先に見る

正解は エ(“A”,“C”,“D”,“D”)です。

この問題に出てくる記号

読めない記号があったときだけ開いてください。

擬似言語の記号 3コ の読み方をひらく
書き方 読み方
PrioQueue: prioQueue ← PrioQueue() 空の優先度付きキューを1つ作って、prioQueue という名前を付ける
prioQueue.enqueue("A", 1) prioQueue に対して enqueue を呼ぶ。ここでは要素 “A” を優先度 1 で追加する
/* … */ 注釈(説明のための書き込み)。実行には関係ない

コードは何をしているか

プログラムは、キューに入れる(enqueue)と取り出す(dequeue)を並べただけです。dequeue の戻り値とは、メソッドが返してくる値 ── ここでは取り出した要素です。途中の dequeue には「戻り値は使用しない」とあるので、取り出した要素は捨てられ、出力されません。出力されるのは、最後の while で残りを全部取り出すときだけです。

取り出す順の決まりは、図の説明のとおり2つです。

  • 優先度の数字がいちばん小さい要素を取り出す(1 が最優先)
  • いちばん小さい数字が複数あれば、先に追加したほう

キューの中身を1行ずつ追って、出力を決める

キューの中身を、追加した順に左から並べて書いていきます。「次へ」で1行ずつ進みます。上の列が要素、下の列がその優先度です。

1行ずつ追う prioSched()

出典:科目B サンプル問題 問8


ループ開始前

配列

▲ いま読んでいる▲ いま書いた

いま計算していること

まだ計算していません

変数の状態

トレース表(進めると1行ずつ積み上がります)

出力を決めるのは、14行目が終わったときに残っている4つです。

14行目のあとに残る4つ ── 入れた順と、出てくる順

琥珀=最後に入れたが最初に出る A / 緑=出力される順

残っている4つ(入れた順)

要素

D

D

C

A

優先度

3

3

2

1

A はいちばん最後に入れましたが、優先度は 1。

while で取り出される順(優先度の小さい順)

要素

A

C

D

D

優先度

1

2

3

3

A(1)→ C(2)→ D(3)→ D(3)。出力は “A”,“C”,“D”,“D”。

8行目・11行目でも優先度 2 が2つ並びますが、11行目で残ったほうは12行目で、8行目で残ったほうも11〜12行目で取り出されるので、どちらを先に出しても最後に残る4つは同じです。この問題では、同じ優先度の決まりは答えを左右しません。

解答群を見る

“A”,“C”,“D”,“D” は エ です。

答え合わせ

正解は エ です。

前半で取り出した A・B・C・B は捨てられているので、出力には出てきません。出力は最後の while の4つだけで、いちばん最後に入れた A が優先度 1 で先頭に出ます。

次に読む

この問題でどこに手間取ったかで、行き先が変わります。

この記事で引用した資料

いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。

Copied title and URL