戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

ITパスポート 2015年 秋期 48


問題文

表に示す構成のデータを、流れ図の手順で処理する場合について考える。流れ図中のx, y, zをそれぞれデータ区分A, B, Cと適切に対応させれば、比較(“xか?”、 “yか?”、 “zか?”)の回数の合計は、最低何回で済むか。
ITパスポート 2015年 秋期  問48の問題画像

選択肢

170(正解)
190
230
250

🔒 解説は解答すると表示されます

表のデータを流れ図で処理する問題【ITパスポート 解説】

正解の理由

流れ図は「xか? → yか? → zか? → その他」の順で比較を行います。各データは、最初に当てはまる項目で比較を止めるため、比較回数はその項目が流れ図のどの位置(x,y,z)に割り当てられるかで変わります。
頻度(件数)が大きいデータほど、比較回数が少ない(先にチェックする)位置に割り当てると合計比較回数が小さくなります。表の頻度は C:50、B:30、A:10、その他:10 なので、最小にするには最も頻度の多い C を x(1回で判定)に、次に多い B を y(2回で判定)に、A を z(3回で判定)に割り当てます。
この割り当てにより、比較回数の合計は 170 回になり、選択肢では が該当します。

解法ステップ

  1. 流れ図の各分岐での比較回数を確認する。
    • x に該当するデータ:比較 1 回で判定(x? が Yes)
    • y に該当するデータ:比較 2 回で判定(x? No → y? Yes)
    • z に該当するデータ:比較 3 回で判定(x? No → y? No → z? Yes)
    • その他のデータ:x,y,z 全て No → 比較 3 回で「その他の処理」へ
  2. 各データ区分の件数に応じた重み付き和を考える。比較回数の合計は次の式で表せる。 ここで は各区分の件数。
  3. 右辺の定数部分 は固定(今回 10 件で 30 回)なので、可変部分 を最小化する。
    大きい件数には小さい係数(先にチェックする位置)を割り当てるのが最適(貪欲法的な直感)。
  4. 頻度順に並べると C(50) > B(30) > A(10)。したがって x=C, y=B, z=A とすると、
    可変部分 =
    その他の固定分 30 を足して合計 170 回になる。

選択肢別の誤答解説

  • ア: 170
    上述の割り当て(x=C, y=B, z=A)で得られる値。最小値であり正解です()。
  • イ: 190
    これは例えば不適切な割り当て(例:x=B, y=C, z=A)などで計算すると出る値です。頻度の高い C を先にチェックしないため余分な比較が発生します。
  • ウ: 230
    さらに悪い順序(例:x=A, y=B, z=C)で、高頻度の C が最後に回るため比較回数が大きくなります。
  • エ: 250
    最も非効率な割り当ての一つで、頻度の大小をまったく考慮していない結果です。
(各選択肢がどの割り当てでどの合計になるかは、下の補足の簡単な計算例で確認できます。)

よくある誤解

  1. 「その他は比較回数に入らない」と考える誤り
    → 「その他」に分類されるデータは x,y,z のいずれにも該当しないため、x?、y?、z? の3回の比較が必要になります。今回の「その他」10件は必ず3回ずつ比較されます。
  2. 「順番を変えても合計は同じ」と思う誤り
    → 順序によって各カテゴリが受ける比較回数(1回・2回・3回)が変わるため合計は変わります。高頻度の項目を前に持ってくるほど合計は小さくなります。

補足コラム

  • 最適な順序決定は「頻度の高いものを先にチェックする」という単純なルールで決まります。これは「期待比較回数の最小化」という観点で直感的に正しい方法です。
  • この考え方は、検索や条件分岐での効率化全般に使えます。例えばよく使うメニュー項目をメニューの上位に置く、検索フィルタを頻度順に適用するなど、日常の設計にも応用できます。
簡単な計算例(すべての順序を試す Python スクリプト例)
import itertools

freq = {'A':10, 'B':30, 'C':50, 'その他':10}
best = None
for perm in itertools.permutations(['A','B','C']):  # perm = (x,y,z)
    total = 1*freq[perm[0]] + 2*freq[perm[1]] + 3*freq[perm[2]] + 3*freq['その他']
    if best is None or total < best[0]:
        best = (total, perm)
best  # (170, ('C','B','A'))

FAQ

Q. 「終わりか?」の判断は比較回数に含めないのですか?
A. 問題は x, y, z の比較回数について問われています。「終わりか?」は別の判断であり、設問の比較回数の対象外です。
Q. 頻度が同じ場合はどうする?
A. 頻度が同じなら、どちらを先にしても可変部分の合計は変わりません(しかし実装上は判断順が微妙に影響することはあります)。
Q. なぜ3回目の比較で「その他」も確定するのですか?
A. 流れ図では z? の後に No の場合に「その他の処理」へ進むため、x,y,z の3つをすべて否定してはじめて「その他」と判断されます。したがって「その他」は常に 3 回の比較を受けます。

関連キーワード: データ分類、流れ図、比較回数、頻度最適化、貪欲法、条件分岐最適化
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

ITパスポート
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について