基本情報技術者試験の科目Bの公開問題を題材に,商品の関連度を求める処理について学習します。この問題では,注文データを集計し,指定した商品と一緒に購入されやすい商品を求める処理を確認します。
令和6年度 基本情報技術者試験 公開問題 科目B 問5
問 次のプログラム中の a ~ c に入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は1から始まる。
一度の注文で購入された商品のリストを,注文ごとに記録した注文データがある。表に,注文データの例を示す。
注文データから,商品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の値をこの順にコンマ区切りで出力する
解答群
a | b | c | |
| ア | 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の要素数 |
【解答】オ
【解説】
このプログラムは,商品間の関連度を計算し,引数で指定した商品と最も関連度が高い商品を求める。まず,arrayK[i] には otherItems[i] が含まれる注文数を,arrayM[i] には item と otherItems[i] が同じ注文に含まれる注文数を格納する。そのため,item と otherItems[i] が同じ注文に含まれる場合は arrayM[i] を1増やし,otherItems[i] が含まれる場合は arrayK[i] を1増やす。したがって,a には arrayM[i],b には arrayK[i] が入る。
また,関連度 Lxy は「同じ注文に含まれる注文数 × 全注文数 ÷ (商品xの注文数 × 商品yの注文数)」で求める。プログラムでは,arrayM[i] が同じ注文に含まれる注文数,itemCount が商品xの注文数,arrayK[i] が商品yの注文数を表している。そのため,c には全注文数を表す orders の要素数が入る。
この問題のポイント
この問題から学べることは,
- 注文データから商品を含む注文数を集計する方法
- 2つの商品が同じ注文に含まれる回数を集計する方法
- 数式の各項とプログラム中の変数を対応させる方法
- 関連度を比較して最大値の商品を求める方法
です。特に,問題文で示された関連度の式とプログラムを対応させ,arrayM[i],arrayK[i],itemCount,ordersの要素数が,式のどの部分に対応しているかを理解しておきましょう。
基本情報技術者試験の学習におすすめの参考書
基本情報技術者試験の合格を目指す方におすすめの参考書です。
学習のお役に立ちましたら
この記事が少しでも学習のお役に立ちましたら,今後も分かりやすい解説や学習コンテンツを継続してお届けする励みになります。
よろしければ、このサイトを応援いただけますと嬉しいです。
※OFUSEは,クリエイターやコンテンツ制作を直接支援できるサービスです。


