科目B

令和6年度 基本情報技術者試験 科目B 公開問題 問5

次のプログラム中のa~cに入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。 一度の注文で購入された商品のリストを,注文ごとに記録した注文データがある。表に,注文データの例を示す。 表 注文データの例
注文番号購入された商品のリスト
1A, B, D
2A, D
3A
4A, B, E
5B
6C, E
注文データから,商品 x と商品 y とが同一の注文で購入されやすい傾向を示す関連度 Lxy を,次の式で計算する。 Lxy = (Mxy × 全注文数) / (Kx × Ky) ここで,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の値をこの順にコンマ区切りで出力する
答えを選ぶ

出典:令和6年度 基本情報技術者試験 科目B 公開問題 問5(問題文は IPA の公開問題。図・数式・下線などはテキストに直して掲載。解説は当サイト作成)

科目Bの解き方と全問の一覧

解説に誤りを見つけたら、解説の誤りを報告してください。

答えと解説を見る

正解:オ

覚える知識

同時購入の関連度(リフト値)を数えるプログラム

関連度 Lxy は、同時購入数×全注文数 ÷(x の購入数×y の購入数)で求める。1 より大きいほど、x と y が一緒に買われやすい。

この問題で必要なこと

二重ループでは、注文に otherItems[i] が含まれるたびに Kx を 1 増やす(b=arrayK[i])。そのうえで item も含まれていれば同時購入の Mxy を 1 増やす(a=arrayM[i])。式の「全注文数」は注文の個数なので、c は orders の要素数。商品の種類数ではない。正解は オ。

ひっかけ

ア〜ウ は M と K を取り違えている(内側の if の中で数えるのは同時購入の M)。ア・エ は c を商品の種類数(allItems)に、ウ・カ は item を除いた商品の種類数(otherItems)にしている。どちらも「全注文数」を商品の数と取り違えた誤り。