科目Bに共通する注意事項(表記ルールなど)については、下記のリンク先を参照してください。
問題
次のプログラム中の [ a ] ~ [ c ] に入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は1 から始まる。
一度の注文で購入された商品のリストを,注文ごとに記録した注文データがある。表に,注文データの例を示す。
商品 x と商品 y とが同一の注文で購入されやすい傾向を示す関連度 $ L_{xy} $ を,次の式で計算する。
$ L_{xy} = (M_{xy} \times 全注文数) \div (K_x \times K_y) $
ここで,$ M_{xy} $ は商品 x と商品 y とが同一の注文で購入された注文数,$ K_x $ は商品 x が購入された注文数,$ K_y $ は商品 y が購入された注文数を表す。
表の例では,$ M_{AB} $ が 2,全注文数が 6,$ K_A $ が 4,$ K_B $ が 3 であるので,商品 A と商品 B の関連度 $ L_{AB} $ は,$ (2 \times 6) \div (4 \times 3) = 1.0 $ である。
手続 putRelatedItem は,大域変数 orders に格納された注文データを基に,引数で与えられた商品との関連度が最も大きい商品のうちの一つと,その関連度を出力する。
プログラムでは,商品は文字列で表し,注文は購入された商品の配列,注文データは注文の配列で表している。注文データには2 種類以上の商品が含まれるものとする。また,注文データにある商品以外の商品が,引数として与えられることはないものとする。
[プログラム]
大域: 文字列型配列の配列: orders ← {{"A", "B", "D"}, {"A", "D"}, {"A"},
{"A", "B", "E"}, {"B"}, {"C", "E"}}
○putRelatedItem(文字列型: item)
文字列型の配列: allItems ← orders に含まれる文字列を重複なく辞書順に格納した配列
文字列型の配列: 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 の値をこの順にコンマ区切りで出力する

