基本情報技術者

問5

基本情報技術者試験過去問 令和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表現を作ります。したがって正解はイです。

不正解

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へ追加する値が正しくありません。

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表現を作ります。したがって正解はイです。

順次、単語を追加予定です。もうしばらくお待ちください。