科目B
基本情報技術者試験 科目B サンプル問題セット(2022年12月公表) 問8
次の記述中の に入れる正しい答えを,解答群の中から選べ。
優先度付きキューを操作するプログラムである。優先度付きキューとは扱う要素に優先度を付けたキューであり,要素を取り出す際には優先度の高いものから順番に取り出される。クラス PrioQueue は優先度付きキューを表すクラスである。クラス PrioQueue の説明を図に示す。ここで,優先度は整数型の値 1,2,3 のいずれかであり,小さい値ほど優先度が高いものとする。
手続 prioSched を呼び出したとき,出力は の順となる。
図 クラス PrioQueue の説明
〔プログラム〕
| コンストラクタ | 説明 |
|---|---|
| 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
答えを選ぶ
出典:基本情報技術者試験 科目B サンプル問題セット(2022年12月公表) 問8(問題文は IPA の公開問題。図・数式・下線などはテキストに直して掲載。解説は当サイト作成)
解説に誤りを見つけたら、解説の誤りを報告してください。
答えと解説を見る
正解:エ
覚える知識
優先度付きキューの操作トレース
優先度付きキューは優先度の高い要素から取り出す。優先度が同じ要素は先に入れたものから取り出す(同順位内は 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 が残った並びを選んでしまう。