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


分類 :
アルゴリズムとプログラミング » プログラミングの諸分野への適用
正解 :
イ
解説 :
One-Hot表現とは、分類の対象となる種類ごとに要素を一つ用意し、該当する種類の位置だけを1、その他の位置を0にする表現方法です。
このプログラムは、大きく二つの処理に分かれています。
最初の繰返し処理では、引数 colors に含まれる色を一つずつ調べ、重複しないように colorVector へ格納します。ループ変数iは、現在調べている colors の要素番号を表します。
最初に colors[1] の"Red"を調べます。colorVector は空なので、"Red"をその末尾に追加します。続く"Green"と"Blue"もまだ colorVector に格納されていないため、それぞれ追加します。最後の colors[4] の"Red"は、既に colorVector に格納されています。そのため、追加は行いません。
この処理によって、colorVector の内容は次のようになります。
ここで"未定義の値"を追加すると、colorVector に色名が格納されず、後の処理で colors の要素と比較できません。
よって、空欄aには colors[i]の値 が当てはまります。
〔bについて〕
次の繰返し処理では、colorsの各要素をOne-Hot表現へ変換します。
外側のfor文は colors の要素の数だけ繰返し、内側のfor文は colorVector の要素の数だけ繰返します。つまり、colors の要素一つずつに対して、colorVector の各要素を照合する形になります。
外型のfor文で使われるループ変数jは、現在、変換対象としている colors の要素番号、内側の繰返しで使われる変数kは、colorVector の要素番号を示します。例えば、colors[j]が"Green"の場合、colorVector の各要素と次のように順番に比較が行われます。
もう一方の選択肢である「colorsの要素のいずれかにcolorVector[k]の値が格納されている」という条件では、条件式は常にtrueとなり、適切なOne-Hot表現にはなりません。
よって、空欄bには colors[j]がcolorVector[k]と等しい が当てはまります。
以上より、正しい組合せは次のとおりです。
このプログラムは、大きく二つの処理に分かれています。
- 引数の配列 colors に含まれる色の種類を colorVector に一つずつ格納する
- colors の各要素を、colorVector を基準にOne-Hot表現へ変換する
最初の繰返し処理では、引数 colors に含まれる色を一つずつ調べ、重複しないように colorVector へ格納します。ループ変数iは、現在調べている colors の要素番号を表します。
最初に colors[1] の"Red"を調べます。colorVector は空なので、"Red"をその末尾に追加します。続く"Green"と"Blue"もまだ colorVector に格納されていないため、それぞれ追加します。最後の colors[4] の"Red"は、既に colorVector に格納されています。そのため、追加は行いません。
この処理によって、colorVector の内容は次のようになります。
{"Red", "Green", "Blue"}
colorVector に追加すべきは色名、すなわち現在の要素の値である colors[i] です。ここで"未定義の値"を追加すると、colorVector に色名が格納されず、後の処理で colors の要素と比較できません。
よって、空欄aには colors[i]の値 が当てはまります。
〔bについて〕
次の繰返し処理では、colorsの各要素をOne-Hot表現へ変換します。
外側のfor文は colors の要素の数だけ繰返し、内側のfor文は colorVector の要素の数だけ繰返します。つまり、colors の要素一つずつに対して、colorVector の各要素を照合する形になります。
外型のfor文で使われるループ変数jは、現在、変換対象としている colors の要素番号、内側の繰返しで使われる変数kは、colorVector の要素番号を示します。例えば、colors[j]が"Green"の場合、colorVector の各要素と次のように順番に比較が行われます。
colors[j]:"Green"
colorVector[1]:"Red" → 一致しないので0
colorVector[2]:"Green" → 一致するので1
colorVector[3]:"Blue" → 一致しないので0
この結果、"Green"のOne-Hot表現として、次の配列が作られます。colorVector[1]:"Red" → 一致しないので0
colorVector[2]:"Green" → 一致するので1
colorVector[3]:"Blue" → 一致しないので0
{0, 1, 0}
上記のように、現在の要素の色名 colors[j] と colorVector[k] を比較し、等しければ1を、異なっていれば0を追加するのが適切な動作です。空欄bには"1"を追加すべき条件式が入るため、colors[j] = colorVector[k] が当てはまります。もう一方の選択肢である「colorsの要素のいずれかにcolorVector[k]の値が格納されている」という条件では、条件式は常にtrueとなり、適切なOne-Hot表現にはなりません。
よって、空欄bには colors[j]がcolorVector[k]と等しい が当てはまります。
以上より、正しい組合せは次のとおりです。
- a:colors[i]の値
- b:colors[j]がcolorVector[k]と等しい

