基本情報技術者試験 令和8年度 科目B 公開問題 問5
次のプログラム中の「a」と「b」に入れる正しい答えの組合せを、解答群の中から選べ。ここで、配列の要素番号は1 から始まる。
【プログラム】 ○整数型配列の配列: oneHotEncoding(文字列型の配列: colors) 整数型: i, j, k 文字列型の配列: colorVector ← {} // 要素数0の配列 整数型の配列: tempVector 整数型配列の配列: oneHotVector ← {} // 要素数0の配列
/* 名前一覧の作成 */ for (i を 1 から colorsの要素数 まで 1 ずつ増やす) if (colorVector の要素のいずれにも colors[i]の値 が格納されていない) colorVectorの末尾 に「a」を追加する endif endfor
/* One-Hot表現への変換 */ for (j を 1 から colorsの要素数 まで 1 ずつ増やす) tempVector ← {} // 要素数0の配列 for (k を 1 から colorVectorの要素数 まで 1 ずつ増やす) if (「b」) tempVectorの末尾 に 1 を追加する else tempVectorの末尾 に 0 を追加する endif endfor oneHotVectorの末尾 に tempVector を追加する endfor return oneHotVector
選択肢を押すと答え合わせができます。
正解と解説を見る
【正解】イ
最初の繰返しでは、入力に登場する色の名前を重複なくcolorVectorへ登録する必要があります。そのため、未登録の色を見つけたときに追加するaはcolors[i]の値です。図の例{Red、Green、Blue、Red}を追跡すると、Red、Green、Blueが順に追加され、2回目のRedは既に登録済みなので追加されません。colorVectorは{Red、Green、Blue}になります。
次の繰返しでは、変換対象であるcolors[j]と、名前一覧のk番目であるcolorVector[k]を比較します。両者が等しい位置だけ1とするので、bは「colors[j]がcolorVector[k]と等しい」です。j=1のRedでは{1、0、0}、j=2のGreenでは{0、1、0}、j=3のBlueでは{0、0、1}、j=4のRedでは再び{1、0、0}となり、図の戻り値と一致します。
アは誤りです。aは正しいですが、bはcolorVector[k]が入力全体のどこかに存在するかを調べています。名前一覧の全要素は必ずcolorsに存在するため、各位置が1となり、{1、1、1}になります。
ウは誤りです。aで色名ではなく未定義の値を追加するため、正しい名前一覧を作れません。また、bも現在変換中のcolors[j]との一致を判定していません。
エは誤りです。bの比較方法は正しいものの、aでcolorVectorに未定義の値を追加するため、colors[j]と比較する色名が保存されません。
【ポイント】 One-Hot表現の要素数は、入力要素数ではなく異なる分類名の個数です。 先に重複のない名前一覧を作り、その一覧内の位置を各分類の1の位置に対応させます。 同じ分類が再登場した場合は、同じOne-Hot表現になります。
【参考】擬似言語の記述形式(基本情報技術者試験用)
擬似言語を使用した問題では、各問題文中に注記がない限り、次の記述形式が適用されているものとする。
〔擬似言語の記述形式〕 ・○手続名又は関数名 手続又は関数を宣言する。 ・型名: 変数名 変数を宣言する。 ・/* 注釈 */ 、 // 注釈 注釈を記述する。 ・変数名 ← 式 変数に式の値を代入する。 ・手続名又は関数名(引数, …) 手続又は関数を呼び出し、引数を受け渡す。
・if (条件式1) 処理1 elseif (条件式2) 処理2 elseif (条件式n) 処理n else 処理n + 1 endif 選択処理を示す。条件式を上から評価し、最初に真になった条件式に対応する処理を実行する。以降の条件式は評価せず、対応する処理も実行しない。どの条件式も真にならないときは、処理n + 1を実行する。各処理は、0以上の文の集まりである。elseifと処理の組みは、複数記述することがあり、省略することもある。elseと処理n + 1の組みは一つだけ記述し、省略することもある。
・while (条件式) 処理 endwhile 前判定繰返し処理を示す。条件式が真の間、処理を繰返し実行する。処理は、0以上の文の集まりである。
・do 処理 while (条件式) 後判定繰返し処理を示す。処理を実行し、条件式が真の間、処理を繰返し実行する。処理は、0以上の文の集まりである。
・for (制御記述) 処理 endfor 繰返し処理を示す。制御記述の内容に基づいて、処理を繰返し実行する。処理は、0以上の文の集まりである。
〔演算子と優先順位〕(上ほど優先度が高い) ・式:() . ・単項演算子:not + - ・二項演算子(乗除):mod × ÷ ・二項演算子(加減):+ - ・二項演算子(関係):≠ ≦ ≧ < = > ・二項演算子(論理積):and ・二項演算子(論理和):or 注記 演算子 . は、メンバ変数又はメソッドのアクセスを表す。 演算子 mod は、剰余算を表す。
〔論理型の定数〕 true, false
〔配列〕 配列の要素は、"["と"]"の間にアクセス対象要素の要素番号を指定することでアクセスする。なお、二次元配列の要素番号は、行番号、列番号の順に","で区切って指定する。 "{"は配列の内容の始まりを、"}"は配列の内容の終わりを表す。ただし、二次元配列において、内側の"{"と"}"に囲まれた部分は、1行分の内容を表す。
〔未定義、未定義の値〕 変数に値が格納されていない状態を、"未定義"という。変数に"未定義の値"を代入すると、その変数は未定義になる。
出典:令和8年度 基本情報技術者試験 科目B 公開問題 問5
※ 解説は SkillStack 編集部が作成したものです。Web 表示のため、図表の配置や表記を一部改めています。