基本情報技術者試験過去問 令和8年度(2026年)科目B問5
次のプログラム中のaとbに入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は1から始まる。
一つの要素だけが1で他の要素が0であるような整数型の配列による表現を,本問ではOne-Hot表現という。関数oneHotEncodingは,図のように,色の名前が格納されている要素数1以上の文字列型の配列を引数として受け取り,配列に含まれる色の名前(図の例では3種類)に基づいて,各要素をOne-Hot表現に変換し,整数型配列の配列に格納して返す。関数oneHotEncodingにおける変換の例を図に示す。

-----------
〔プログラム〕
○整数型配列の配列: 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
-----------

選択肢
- ア
- イ
- ウ
- エ
正解と解き方・学習ポイント(AI解説)
aにはcolors[i]の値が入ります。最初のループは、入力配列colorsを先頭から確認し、まだcolorVectorに存在しない色名だけをcolorVectorの末尾に追加して、重複のない色名一覧を作る処理です。
bには「colors[j]がcolorVector[k]と等しい」が入ります。次のループは、colors[j]の値とcolorVector[k]を照合し、一致する位置だけ1、それ以外は0をtempVectorに追加してOne-Hot表現を作ります。したがって正解はイです。
Point
この問題は、One-Hot表現を作る処理を、配列の走査と条件判定として読み取れるかを確認する問題です。重複のない色名一覧を作る処理と、一覧との一致位置だけを1にする処理を、変数i、j、kの役割に沿って説明できることが求められます。
解くために必要な知識
この問題を解くには、One-Hot表現と、配列を走査して重複を除去する処理、配列同士の要素比較の考え方が必要です。
用語の整理
| 用語 | 意味 |
|---|---|
| One-Hot表現 | 対象カテゴリに対応する位置だけを1、その他を0にした配列で表す方法です。 |
| 配列 | 同じ型のデータを順番に格納するデータ構造です。 |
| 要素番号 | 配列の各要素に付く番号です。本問では1から始まります。 |
処理の全体像
1. 名前一覧(colorVector)の作成
目的は、colorsに含まれる色名を重複なしで並べることです。
-
確認対象: colors[i]
-
追加先: colorVector
-
追加条件: colorVectorのどの要素にもcolors[i]が存在しない
この処理により、colorVectorはカテゴリ一覧として使えます。
2. One-Hot表現(tempVector)の作成
目的は、colors[j]がカテゴリ一覧のどれに該当するかを0/1で表すことです。
-
比較対象: colors[j] と colorVector[k]
-
一致した位置: 1
-
一致しない位置: 0
One-Hot表現が成立する条件
tempVectorは次の性質を満たす必要があります。
-
colorVector内で一致する位置が1つだけ1になる
-
それ以外は0になる
この条件を満たすために、比較条件は「colors[j] が colorVector[k] と等しい」になります。
問題の解法手順
この問題は、処理が次の2段階に分かれている点を押さえると解けます。
名前一覧の作成(空欄a)
処理の目的
colorsに出現する色名を重複なしでcolorVectorに集めます。
aに入る内容
ループ変数iで見ている現在の要素を、未登録なら末尾に追加します。したがって、追加するのは colors[i] の値です。
One-Hot表現への変換(空欄b)
処理の目的
colors[j]を、colorVectorのどの位置の要素と一致するかで0/1の配列に変換します。
bに入る条件
kでcolorVectorを順に見ながら、一致する位置だけ1にする必要があります。
-
一致するときは1を追加する
-
一致しないときは0を追加する
よって条件bは「colors[j] が colorVector[k] と等しい」です。
選択肢ごとの解説
- ア:不正解
aは適切ですが、bが「colorsの要素のいずれかにcolorVector[k]の値が格納されている」となっており、現在処理中のcolors[j]に対応する位置だけを1にできません。One-Hot表現では、各jごとにcolors[j]とcolorVector[k]を比較する必要があります。
- イ:正解
aがcolors[i]の値で、未登録の色名をcolorVectorへ追加できます。bが「colors[j]がcolorVector[k]と等しい」で、該当位置だけ1、それ以外0のtempVectorを作れます。
- ウ:不正解
aが未定義の値では、colorVectorに正しい色名を追加できず、名前一覧を作れません。
- エ:不正解
bは適切ですが、aが未定義の値では、名前一覧を作る段階でcolorVectorへ追加する値が正しくありません。
まとめ
aにはcolors[i]の値が入ります。最初のループは、入力配列colorsを先頭から確認し、まだcolorVectorに存在しない色名だけをcolorVectorの末尾に追加して、重複のない色名一覧を作る処理です。
bには「colors[j]がcolorVector[k]と等しい」が入ります。次のループは、colors[j]の値とcolorVector[k]を照合し、一致する位置だけ1、それ以外は0をtempVectorに追加してOne-Hot表現を作ります。したがって正解はイです。
aは適切ですが、bが「colorsの要素のいずれかにcolorVector[k]の値が格納されている」となっており、現在処理中のcolors[j]に対応する位置だけを1にできません。One-Hot表現では、各jごとにcolors[j]とcolorVector[k]を比較する必要があります。
aがcolors[i]の値で、未登録の色名をcolorVectorへ追加できます。bが「colors[j]がcolorVector[k]と等しい」で、該当位置だけ1、それ以外0のtempVectorを作れます。
aが未定義の値では、colorVectorに正しい色名を追加できず、名前一覧を作れません。
bは適切ですが、aが未定義の値では、名前一覧を作る段階でcolorVectorへ追加する値が正しくありません。