科目B

基本情報技術者試験 科目B サンプル問題セット(2022年12月公表) 問8

次の記述中の に入れる正しい答えを,解答群の中から選べ。 優先度付きキューを操作するプログラムである。優先度付きキューとは扱う要素に優先度を付けたキューであり,要素を取り出す際には優先度の高いものから順番に取り出される。クラス PrioQueue は優先度付きキューを表すクラスである。クラス PrioQueue の説明を図に示す。ここで,優先度は整数型の値 1,2,3 のいずれかであり,小さい値ほど優先度が高いものとする。 手続 prioSched を呼び出したとき,出力は の順となる。
コンストラクタ説明
PrioQueue()空の優先度付きキューを生成する。
メソッド戻り値説明
enqueue(文字列型: s, 整数型: prio)なし優先度付きキューに,文字列 s を要素として,優先度 prio で追加する。
dequeue()文字列型優先度付きキューからキュー内で最も優先度の高い要素を取り出して返す。最も優先度の高い要素が複数あるときは,そのうちの最初に追加された要素を一つ取り出して返す。
size()整数型優先度付きキューに格納されている要素の個数を返す。
図 クラス PrioQueue の説明 〔プログラム〕
○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
答えを選ぶ

出典:基本情報技術者試験 科目B サンプル問題セット(2022年12月公表) 問8(問題文は IPA の公開問題。図・数式・下線などはテキストに直して掲載。解説は当サイト作成)

科目Bの解き方と全問の一覧

解説に誤りを見つけたら、解説の誤りを報告してください。

答えと解説を見る

正解:エ

覚える知識

優先度付きキューの操作トレース

優先度付きキューは優先度の高い要素から取り出す。優先度が同じ要素は先に入れたものから取り出す(同順位内は FIFO)。

この問題で必要なこと

A1,B2,C2,D3 を入れて 2 回 dequeue すると A、B が出て {C2,D3}。D3,B2 を入れて {C2,D3,D3,B2} から 2 回取り出すと、優先度 2 の C(先に追加)→B が出て {D3,D3}。C2,A1 を入れて全部取り出すと A,C,D,D でエが正解。

ひっかけ

後から追加した B2 のほうが C2 より先に出ると考える、あるいは途中の dequeue で消えた要素を残っているものとして数えると、ア〜ウのように B や C が残った並びを選んでしまう。