過去問解きまくり研究所 ホーム

令和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

解答群は原典では a・b の組合せの表。

答えと解説を見る

✓ これが正解イa:colors[i]の値 / b:colors[j] が colorVector[k] と等しい

解説

一覧に colors[i]の値 を足し、名前が等しい位置だけ 1 にします。

プログラムは二段に分かれています。前半で colors から重複のない色の名前の一覧 colorVector を作り、後半で colors の各要素について、一覧の何番目の名前と一致するかを 1 と 0 の並びで表します。軸は、前半で一覧に何を追加するか(a)と、後半で 1 を置く条件(b)です。

前半の if は、colors[i] の値がまだ一覧に無いときだけ真になります。そこで追加すべきなのは、その色の名前である colors[i]の値 です。図の引数 {"Red", "Green", "Blue", "Red"} では、i = 1 から 3 で Red、Green、Blue が追加され、i = 4 の Red はすでに一覧にあるので追加されません。colorVector は {"Red", "Green", "Blue"} になります。

後半では、j 番目の色について k を 1 から 3 まで動かし、colors[j] が colorVector[k] と等しい位置だけ 1 を、それ以外は 0 を追加します。j = 1 の Red は k = 1 だけが等しいので {1, 0, 0}、j = 2 の Green は {0, 1, 0}、j = 3 の Blue は {0, 0, 1}、j = 4 は再び {1, 0, 0} となり、図の戻り値と一致します。

One-Hot 表現は、一覧の中で自分と同じ名前の位置だけを 1 にする形なので、比べる相手は今見ている一つの要素 colors[j] だと押さえると、条件を取り違えません。

ほかの選択肢はなぜ違うのか

出典:令和8年度 基本情報技術者試験 科目B 問5

この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)