この概念が出た関連問題

この試験の対策ガイド

基本情報技術者試験 対策ガイド

合格率・勉強法・参考書の選び方をまとめています

見る →
答えと解説を見る(先に解くのがおすすめ)

正解は ク

解説

文字列パターンマッチング(部分文字列検索)プログラムのトレースで、特定の行(β行)が条件式が真になる回数を数える問題です。プログラムはdata配列からkey配列のパターンを探す総当たり(ブルートフォース)アルゴリズムです。search({"a","b","a","b","c","a","b","c"}, {"a","b","c"})を呼び出した場合のトレース:dataは8文字、keyは3文字。外側ループi(dataの開始位置):1〜6(8-3+1=6回)。内側ループj(keyの各文字を比較):1〜3。β行は「data[i+j-1] = key[j](またはこれに類した文字一致チェック)」です。i=1のとき:a=a✓、b=b✓、a≠c✗(2回一致)。i=2のとき:b≠a✗(0回一致、即終了)。i=3のとき:a=a✓、b=b✓、c=c✓(3回一致、パターン発見)。i=4のとき:b≠a✗(0回一致)。i=5のとき:a=a✓、b=b✓、c=c✓(3回一致、パターン発見)。i=6のとき:b≠a✗(0回一致)。β行の真の回数合計:2+0+3+0+3+0 = 8回。問題の正解はh。

なぜ他の選択肢は違うのか

選択肢 ア
1回は大幅に少ない。完全一致した箇所だけでi=3とi=5でそれぞれ3回の一致があり、合計6回以上は確実に真になります。
選択肢 イ
2回はパターンが見つかった回数(2箇所)と混同している可能性があります。β行はマッチング試行中の個々の文字比較ごとに評価され、一致した回数を数えます。
選択肢 ウ
3回はkeyの長さ(3文字)と混同している可能性があります。1回の完全マッチでも3回の一致が起きており、部分的な一致(i=1で2回)も含めた合計を数える必要があります。
選択肢 エ
4回はi=1の2回+マッチ2回を足したような計算の誤りです。全てのiの開始位置でのβ行の真の回数を漏れなく合計する必要があります。

解くときのポイント

パターンマッチングのトレース:各開始位置iで内側ループをトレースし、文字が一致するたびにβ行の「真」をカウント。不一致で内側ループが終了する場合も途中の一致分はカウントに含める。表を作って整理するのが確実。