基本情報技術者試験の公開問題を解こう!(令和6年度・科目B)(5)「注文データから商品間の関連度を求める」

スポンサーリンク
IT系

基本情報技術者試験の令和6年度の公開問題(科目B)を解いてみよう。

問5 次のプログラム中の に入れる正しい答えの組合せを,

解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。 

一度の注文で購入された商品のリストを,注文ごとに記録した注文データがある。
表に,注文データの例を示す

表 注文データの例
注文番号購入された商品のリスト
A, B, D
A, D
A
A, B, E
B
C, E

注文データから,商品 x と商品 y とが同一の注文で購入されやすい傾向を示す関連 度 Lxy を,次の式で計算する。 

ここで,Mxy は商品 x と商品 y とが同一の注文で購入された注文数,Kx は商品 x が 購入された注文数,Ky は商品 y が購入された注文数を表す。表の例では,MAB が 2, 全注文数が 6,KA が 4,KB が 3 であるので,商品 A と商品 B の関連度 LAB は,(2 × 6) / (4 × 3) = 1.0 である。 

手続 putRelatedItem は,大域変数 orders に格納された注文データを基に,引数で 与えられた商品との関連度が最も大きい商品のうちの一つと,その関連度を出力する。 プログラムでは,商品は文字列で表し,注文は購入された商品の配列,注文データは 注文の配列で表している。注文データには 2 種類以上の商品が含まれるものとする。 また,注文データにある商品以外の商品が,引数として与えられることはないものとする。 

〔プログラム〕 

// 注文データ(ここでは表の例を与えている)
大域: 文字列型配列の配列: orders ← {{"A", "B", "D"}, {"A", "D"}, {"A"},
                                  {"A", "B", "E"}, {"B"}, {"C", "E"}}
○putRelatedItem(文字列型: item)
文字列型の配列: allItems ← ordersに含まれる文字列を
                         重複なく辞書順に格納した配列
                         // 表の例では {"A", "B", "C", "D", "E"}

文字列型の配列: otherItems ← allItemsの複製から値がitemである
                            要素を除いた配列
整数型: i, itemCount ← 0
整数型の配列: arrayK ← {otherItemsの要素数個の0}
整数型の配列: arrayM ← {otherItemsの要素数個の0}
実数型: valueL, maxL ← -∞
文字列型の配列: order
文字列型: relatedItem

for (orderにordersの要素を順に代入する)
if (orderのいずれかの要素の値がitemの値と等しい)
  itemCountの値を1増やす
endif
for (iを1からotherItemsの要素数まで1ずつ増やす)
 if (orderのいずれかの要素の値がotherItems[i]の値と等しい)
  if (orderのいずれかの要素の値がitemの値と等しい)
    (a)の値を1増やす
  endif
    (b)の値を1増やす
  endif
 endfor
endfor
for (iを1からotherItemsの要素数まで1ずつ増やす)
 valueL ← (arrayM[i] ×(c) ) ÷ (itemCount × arrayK[i])
                  /* 実数として計算する */

if (valueLがmaxLより大きい)
 maxL ← valueL
 relatedItem ← otherItems[i]
 endif
endfor
relatedItemの値とmaxLの値をこの順にコンマ区切りで出力する

※プログラム中の行番号は、筆者が追記した。

解答群

 bc
ア arrayK[i] arrayM[i] allItemsの要素数
イ arrayK[i] arrayM[i] ordersの要素数
ウ arrayK[i] arrayM[i] otherItemsの要素数
エ arrayM[i] arrayK[i] allItemsの要素数
オ arrayM[i] arrayK[i] ordersの要素数
カ arrayM[i] arrayK[i] otherItemsの要素数

正解:オ

この問題は、「商品Aと一緒に購入される可能性が高い商品はどれかを、関連度Lxyの式を用いて求める」という内容である。
具体的には、putRelatedItem手続で、指定された商品 item と一緒に購入された商品を調べ、関連度が最大のものを見つけて表示する処理となる。

与えられた式:関連度Lxy

  • Mxy: 商品xと商品yが同じ注文で買われた数
  • Kx: 商品xが買われた回数(注文数)
  • Ky: 商品yが買われた回数(注文数)
  • 全注文数: ordersの要素数(つまり、注文の総数)

プログラム中の空欄を考える

空欄 a:Mxy をカウントする処理

if (orderのいずれかの要素の値がitemの値と等しい)
    の値を1増やす ← a

→ このとき、item と otherItems[i] の両方が含まれているので、arrayM[i] を増やす。

a = arrayM[i]

空欄 b:Ky をカウントする処理

if (orderのいずれかの要素の値がotherItems[i]の値と等しい)
    の値を1増やす ← b

→ これは otherItems[i] が含まれている注文数をカウントしているので、arrayK[i] を増やす。

b = arrayK[i]

空欄 c:Lxy の計算式

valueL ← (arrayM[i] ×□ ) ÷ (itemCount × arrayK[i]) ← c

→ itemCount は Kx、arrayK[i] は Ky、arrayM[i] は Mxy。残るのは「全注文数」となる。

c = ordersの要素数

選択肢と照合してみると、

  • a = arrayM[i]
  • b = arrayK[i]
  • c = ordersの要素数

つまり、正解は「オ」となる。

この問題では「関連度の定義式に合うように、必要な変数に正しく値をカウントしているか」を読み解くことが、正解へのアプローチとなる。
キーになるのは、

  • arrayM[i] → Mxyのカウント
  • arrayK[i] → Kyのカウント
  • itemCount → Kx
  • ordersの要素数 → 全注文数

コメント

タイトルとURLをコピーしました