科目B
令和8年度 基本情報技術者試験 科目B 公開問題 問5
次のプログラム中のaとbに入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。
一つの要素だけが 1 で他の要素が 0 であるような整数型の配列による表現を,本問では One-Hot 表現という。関数 oneHotEncoding は,図のように,色の名前が格納されている要素数 1 以上の文字列型の配列を引数として受け取り,配列に含まれる色の名前(図の例では 3 種類)に基づいて,各要素を One-Hot 表現に変換し,整数型配列の配列に格納して返す。関数 oneHotEncoding における変換の例を図に示す。
〔図〕図 関数 oneHotEncoding における変換の例
引数の例:{"Red", "Green", "Blue", "Red"}
↓
"Red"の One-Hot 表現:{1, 0, 0}
"Green"の One-Hot 表現:{0, 1, 0}
"Blue"の One-Hot 表現:{0, 0, 1}
↓
引数の例に対応する戻り値:{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}, {1, 0, 0}}
〔プログラム〕
○整数型配列の配列: 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
答えを選ぶ
出典:令和8年度 基本情報技術者試験 科目B 公開問題 問5(問題文は IPA の公開問題。図・数式・下線などはテキストに直して掲載。解説は当サイト作成)
解説に誤りを見つけたら、解説の誤りを報告してください。
答えと解説を見る
正解:イ
覚える知識
One-Hot表現(カテゴリの符号化)
One-Hot 表現は、カテゴリの種類数と同じ長さの配列で、該当する位置だけを 1、ほかを 0 にして表す符号化。
この問題で必要なこと
前半では、まだ入っていない色の名前を colorVector に追加して名前の一覧を作るので、a は colors[i]の値。後半では、j 番目の色が一覧の k 番目と同じ位置だけ 1 にするので、b は「colors[j] が colorVector[k] と等しい」。{"Red","Green","Blue","Red"} をトレースすると、図のとおりの結果になる。正解はイ。
ひっかけ
ウ・エのように a を未定義の値にすると、一覧に色の名前が入らない。ア・ウの b(「colors のいずれかに colorVector[k] がある」)は、j と関係なく常に真になる。そのため全要素が {1,1,1} になってしまう。