基本情報【科目B】令和6年度サンプル問題問5(注文データ):式とプログラムを照らし合わせる

Uncategorized

基本情報技術者試験 科目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 の要素数
穴埋めが3箇所あり、問題文も長いので、解答群を整理した上記のような表を、用紙に書いておきましょう。書いておくと、あり得ない選択肢を消しながら、かつ解答群を常に見ながら解けます。

(記述例)

解答群を整理して用紙に書いた例

③問われている内容を確認【 c 】

【a】【b】【c】のうち、解答しやすそうなものから解いていきます。

valueL ← (arrayM[i] × 【 c 】) ÷ (itemCount × arrayK[i]) について、プログラム中の計算式はここだけです。さらに、その後の処理は、式の結果に対して追加で必要な処理(①より)であると推測できます。

なお、このあとの `if (valueLがmaxLより大きい)` 以降の処理は、`関連度が最も大きい商品のうちの一つと,その関連度を出力する`(問題文より)処理です。このあたりは、時間に余裕がある場合に確認すればOKです。

よって問題文の式がプログラム上ここに該当すると判断できます。

式は、プログラムの後半(戻り値付近、もしくは戻り値そのもの)に、目立つ形で記載されています。ざっとプログラムを見て「コレだな」と当たりをつけて解いても問題ありません。

(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】は ordersallItemsotherItems の3択です。

式とプログラムも離れていて一画面上に表示しづらいので、式を用紙に書くと比較しやすくなります。

(記述例)

問題文の式を用紙に書いた例

それぞれの変数の説明を問題文から探すと、以下がわかります。

変数 説明 記述箇所
orders 大域変数 orders に格納された注文データ 問題文
allItems ordersに含まれる文字列を重複なく辞書順に格納した配列 プログラム内
otherItems allItemsの複製から値がitemである要素を除いた配列 プログラム内
引数に関する説明は、問題文の「関数○○は、〜〜を引数として××を返す」の部分に記載されています。

「全注文数」と合致するのは orders のみです。よって c は ordersの要素数 です。

「注文」というキーワードで探してもOKです。当てはまるのは `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]}$$

M か K かで区別するとわかりやすいです。

⑤Mxy、Ky が何を指すのかを確認

問題文より、Mxy は商品 x と商品 y とが同一の注文で購入された注文数、Ky は商品 y が購入された注文数です。

用紙にうまく整理しながら解きましょう。ここまでの内容を反映したものが以下です。

式とプログラムを照らし合わせて整理した例

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

上記より、【b】よりも【a】の方が増やす際の条件が多いです。

if()内の条件式を、具体的に読み取る必要はありません。「【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】に時間がかかりそうなら、他の問題に進んでしまい、取りこぼしを無くすことを優先しましょう。

関連リンク

式の読解の関連問題です。

基本情報【科目B】令和4年度サンプル問題問12(式の読解・類似度):cntを式と照合する
基本情報技術者試験 科目Bの「令和4年度 サンプル問題 問12」(式の読解・配列の類似度 simRatio)を、図解で解説します。穴埋めの中身は、cnt が何を数えている変数なのかを、戻り値の式と照らし合わせる だけで決まります。 動画で見...
基本情報科目B-サンプル問題【全44問をがっつり解説】
※サンプル問題だけを解くのは,非効率です。詳細は以下の動画をご確認ください。 おすすめの学習順 サンプル問題(過去問・公開問題)だけを順に解くと、基礎を飛ばしがちになります。そこで、サンプル問題(★)を骨格にしつつ、合間に基礎固め(−)を挟...

関連動画

式の読解の基礎が学べる、同じ章の動画です。

講座の全動画はこちら(プレイリスト)。

6/30まで限定 無料プレゼント

サンプル問題だけ解いても、
合格できません

サンプル問題は応用ばかり。学習には不向きで、非効率です。段階的に学べるオリジナル問題50問を加えた学習専用サイトを、今だけ無料でプレゼント中

⏱ 2分で終わるアンケートに答えるだけ!

科目B 学習専用サイト ▶ アンケートに答えてサイトを受け取る

※ Googleフォーム(SSL)に移動します

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