基本情報技術者試験 科目Bの「令和6年度 サンプル問題 問5」(式の読解・商品の関連度)を、図解で解説します。情報量の多い問題ですが、問題文の式とプログラム中の計算式を1対1で照らし合わせる だけで、3つの空欄が決まります。
動画で見たい方はこちら▼
問題(令和6年度 サンプル問題 問5)
次のプログラム中の【 a 】〜【 c 】に入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。
一度の注文で購入された商品のリストを,注文ごとに記録した注文データがある。表に,注文データの例を示す。
表 注文データの例
| 注文番号 | 購入された商品のリスト |
|---|---|
| 1 | A, B, D |
| 2 | A, D |
| 3 | A |
| 4 | A, B, E |
| 5 | B |
| 6 | C, E |
注文データから,商品 x と商品 y とが同一の注文で購入されやすい傾向を示す関連度 Lxy を,次の式で計算する。
$$L_{xy} = \frac{M_{xy} \times \text{全注文数}}{K_x \times K_y}$$
ここで Mxy は商品 x と y が同一の注文で購入された注文数,Kx は商品 x が購入された注文数,Ky は商品 y が購入された注文数。表の例では MAB が2,全注文数が6,KA が4,KB が3なので,LAB は (2 × 6) ÷ (4 × 3) = 1.0 である。
手続 putRelatedItem は,大域変数 orders の注文データを基に,引数で与えられた商品との関連度が最も大きい商品のうちの一つと,その関連度を出力する。
大域:文字列型配列の配列:orders ← {{"A","B","D"}, {"A","D"}, {"A"},
{"A","B","E"}, {"B"}, {"C","E"}}
○putRelatedItem(文字列型:item)
文字列型の配列:allItems ← ordersに含まれる文字列を重複なく辞書順に格納した配列
文字列型の配列:otherItems ← allItemsの複製から値がitemである要素を除いた配列
// 表の例では {"A","B","C","D","E"}
整数型: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の要素数 |
本番さながらの環境で解いてみたい方はこちら↓
解説
正解は オ(arrayM[i] | arrayK[i] | ordersの要素数) です。
①式と戻り値を確認
以下が関連度の式です。
$$L_{xy} = \frac{M_{xy} \times \text{全注文数}}{K_x \times K_y}$$
引数で与えられた商品との関連度が最も大きい商品のうちの一つと,その関連度を出力する とあり、式の結果に対して追加で処理が必要であることを確認しておきます。
②解答群を確認
解答群を整理すると、以下となります。
| 空欄 | 候補 |
|---|---|
| a・b | arrayM[i]・arrayK[i] もしくは arrayK[i]・arrayM[i] |
| c | allItems / orders / otherItems の要素数 |
(記述例)

③問われている内容を確認【 c 】
valueL ← (arrayM[i] × 【 c 】) ÷ (itemCount × arrayK[i]) について、プログラム中の計算式はここだけです。さらに、その後の処理は、式の結果に対して追加で必要な処理(①より)であると推測できます。
よって問題文の式がプログラム上ここに該当すると判断できます。
(arrayM[i] × 【 c 】) ÷ (itemCount × arrayK[i]) を分数で表すと、以下となります。
$$\frac{arrayM[i] \times \text{【 c 】}}{itemCount \times arrayK[i]}$$
対応する問題文の式は、以下です。
$$L_{xy} = \frac{M_{xy} \times \text{全注文数}}{K_x \times K_y}$$
照らし合わせると【 c 】は 全注文数 です。ここで【c】は orders、allItems、otherItems の3択です。
(記述例)

それぞれの変数の説明を問題文から探すと、以下がわかります。
| 変数 | 説明 | 記述箇所 |
|---|---|---|
| orders | 大域変数 orders に格納された注文データ | 問題文 |
| allItems | ordersに含まれる文字列を重複なく辞書順に格納した配列 | プログラム内 |
| otherItems | allItemsの複製から値がitemである要素を除いた配列 | プログラム内 |
「全注文数」と合致するのは orders のみです。よって c は ordersの要素数 です。
④問われている内容を確認【 a 】【 b 】
解答群より、a と b は arrayM[i] か arrayK[i] のどちらかです。a か b どちらかが決まれば、もう片方も決まります。式を照らしあわせると、arrayM[i] は Mxy、arrayK[i] は Ky です。
(問題文の式)
$$L_{xy} = \frac{M_{xy} \times \text{全注文数}}{K_x \times K_y}$$
(プログラム上の式)
$$\frac{arrayM[i] \times \text{【 c 】}}{itemCount \times arrayK[i]}$$
⑤Mxy、Ky が何を指すのかを確認
問題文より、Mxy は商品 x と商品 y とが同一の注文で購入された注文数、Ky は商品 y が購入された注文数です。

if (orderのいずれかの要素の値がotherItems[i]の値と等しい)
if (orderのいずれかの要素の値がitemの値と等しい)
【 a 】の値を1増やす
endif
【 b 】の値を1増やす
endif
上記より、【b】よりも【a】の方が増やす際の条件が多いです。
「y が注文されている」よりも「y が注文されていて、x も注文されている」の方が条件が多いので、【a】は arrayM[i] (Mxy)、【b】は arrayK[i] (Ky) です。
よって正解は オ(arrayM[i] | arrayK[i] | ordersの要素数) です。
Memo: 時間がかかりそうな問題は「2択まで絞って先に進む」のも、むしろあり
本問のように情報量が多い問題は、途中まで解けば2択までは絞れることが多いです。そこから1つに絞るのに時間がかかりそうなら、いったん他の問題へ進み、時間が余ったら戻るのもあり。むしろ後回しにしてすべての問題を手広く解答する方が、より確実に合格基準点600点以上をとれる立ち回りです。
本問なら【c】さえ確定できれば、残りは2択です。【a】【b】に時間がかかりそうなら、他の問題に進んでしまい、取りこぼしを無くすことを優先しましょう。
関連リンク
式の読解の関連問題です。


関連動画
式の読解の基礎が学べる、同じ章の動画です。
講座の全動画はこちら(プレイリスト)。
6/30まで限定 無料プレゼント
サンプル問題だけ解いても、
合格できません
サンプル問題は応用ばかり。学習には不向きで、非効率です。段階的に学べるオリジナル問題50問を加えた学習専用サイトを、今だけ無料でプレゼント中
⏱ 2分で終わるアンケートに答えるだけ!
▶ アンケートに答えてサイトを受け取る
※ Googleフォーム(SSL)に移動します
