ITの基礎知識|ITパスポート・基本情報

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

2026.07.13

科目Bに共通する注意事項(表記ルールなど)については、下記のリンク先を参照してください。

基本情報技術者 令和6年公開問題 科目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 の値をこの順にコンマ区切りで出力する

解答群

Show answer

解答

解説

関連度の式とプログラム中の変数の対応を整理するのが攻略の鍵です。

$ L_{xy} = (M_{xy} \times 全注文数) \div (K_x \times K_y) $

  • $ M_{xy} $(item と otherItems[i] が同一注文で一緒に購入された注文数)→ arrayM[i]
  • $ K_x $(item が購入された注文数)→ itemCount
  • $ K_y $(otherItems[i] が購入された注文数)→ arrayK[i]
  • 全注文数 → orders の要素数

空欄 a・b の判定

内側の if 文の構造に注目します。

  • 外側の条件「order に otherItems[i] が含まれる」が真のとき
    • さらに内側の条件「order に item も含まれる」が真なら → item と otherItems[i] が同時購入された注文 → 増やすのは arrayM[i](=空欄 a)
    • 内側の条件の真偽に関係なく → otherItems[i] が購入された注文 → 増やすのは arrayK[i](=空欄 b)

つまり a = arrayM[i],b = arrayK[i] です。この時点で選択肢はエ・オ・カに絞れます。

空欄 c の判定

valueL の計算式を関連度の式と見比べると,c は「全注文数」に対応する箇所です。

  • allItems の要素数:商品の種類数(例では 5)→ 誤り
  • orders の要素数:全注文数(例では 6)→ 正しい
  • otherItems の要素数:item 以外の商品の種類数(例では 4)→ 誤り

よって c = orders の要素数となり,が正解です。

検算

item ="A" のとき,otherItems ={"B", "C", "D", "E"},itemCount = 4。B について arrayM = 2(注文 1, 4),arrayK = 3(注文 1, 4, 5)なので,$ valueL = (2 \times 6) \div (4 \times 3)= 1.0 $ となり,問題文の $ L_{AB} = 1.0 $ と一致します。

この種の問題は,数式の各項とプログラム中の変数・カウント条件を 1 対 1 で対応付けてしまえば,トレースをほとんどせずに解けます。