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

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

2026.06.04

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

基本情報技術者 令和7年公開問題 科目Bの注意事項


問題

次の記述中の空欄に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は1 から始まる。

関数 search は,data から key の要素の並びと同じ並びを全て探し,その先頭の要素番号を全て格納した配列を返す。見つからなければ,要素数0 の配列を返す。関数 search を search({“a”,”b”,”a”,”b”,”c”,”a”,”b”,”c”}, {“a”,”b”,”c”}) として呼び出すと,`/*** β ***/` の行の条件式が真となる回数は[    ]回である。

[プログラム]

/* keyは,要素数1以上の配列である */
○整数型の配列: search(文字型の配列: data, 文字型の配列: key)
  整数型: i, j, lenData, lenKey
  整数型の配列: result ← {}  // 要素数0の配列

  lenData ← dataの要素数
  lenKey ← keyの要素数

  /* (lenData - lenKey + 1) が0以下のときは繰返し処理を実行しない */
  for (i を 1 から (lenData − lenKey + 1) まで 1 ずつ増やす)

    for (j を 1 から lenKey まで 1 ずつ増やす) // α
      if (data[i + j − 1] が key[j] と等しい) /*** β ***/
        if (j が lenKey と等しい)
          resultの末尾 に iの値 を追加する
        endif
      else
        αの行から始まる繰返し処理を終了する
      endif
    endfor
  endfor
  return result

  • ア:1
  • イ:2
  • ウ:3
  • エ:4
  • オ:5
  • カ:6
  • キ:7
  • ク:8
  • ケ:9
  • コ:10

Show answer

解答

解説

アルゴリズムのポイント

このアルゴリズムは,文字列 data の各位置 i から key との文字照合を行う,単純文字列照合(ブルートフォース法) です。照合が途中で失敗したら内側ループを打ち切り(α ループ終了),次の i へ移ります。

入力の確認

  • data = {“a”,”b”,”a”,”b”,”c”,”a”,”b”,”c”}
    • 要素が8個あるので、lenData = 8 となる。
  • key = {“a”,”b”,”c”}
    • 要素が3個あるので、lenKey = 3 となる。

このことから、今回の i の範囲は、1 から (8 − 3 + 1) = 6 までとなるので、一番外側のループに関しては、最大で6回実行されることになります。

その1段階内側の α の行で始まるループに関しては、「 j を 1 から lenKey まで1ずつ増やす」とあるので、今回は j が 1 から 3 までとなります。そのため、α の行で始まるループは【最大】で6×3=18回実行されることになりますが、β の条件を満たさなかった場合、α の行で始まるループはそこで終了するので、毎回18回ループが実行されるわけでは無い。

肝心の β の条件は以下のようになっており、これが真の場合のみ、α のループが継続するのが本プログラムの動作となっています。

条件:`data[ i + j – 1 ] = key[ j ]`

全パターンをトレース

  • i = 1(data[1]=”a” から始まる 3 文字との照合)
    • j=1:data[1]=”a” vs key[1]=”a” → 真(β=1)
    • j=2:data[2]=”b” vs key[2]=”b” → 真(β=2)
    • j=3:data[3]=”a” vs key[3]=”c” → 偽 → α ループ終了
  • i = 2(data[2]=”b” から)
    • j=1:data[2]=”b” vs key[1]=”a” → 偽 → α ループ終了
  • i = 3(data[3]=”a” から)
    • j=1:data[3]=”a” vs key[1]=”a” → 真(β=3)
    • j=2:data[4]=”b” vs key[2]=”b” → 真(β=4)
    • j=3:data[5]=”c” vs key[3]=”c” → 真(β=5)
    • j=lenKey → result に 3 を追加
    • このループは「検索文字列が見つかった」というパターンになりますが、「同じ並びを全て探す」プログラムなので、ここで検索終了とはせずに、処理が継続します。
  • i = 4(data[4]=”b” から)
    • j=1:data[4]=”b” vs key[1]=”a” → 偽 → α ループ終了
  • i = 5(data[5]=”c” から)
    • j=1:data[5]=”c” vs key[1]=”a” → 偽 → α ループ終了
  • i = 6(data[6]=”a” から)
    • j=1:data[6]=”a” vs key[1]=”a” → 真(β=6)
    • j=2:data[7]=”b” vs key[2]=”b” → 真(β=7)
    • j=3:data[8]=”c” vs key[3]=”c” → 真(β=8)
    • j=lenKey → result に 6 を追加

β が真になった回数:2 + 3 + 3 = 8 回

なお、戻り値は {3, 6}(key=”abc” が見つかった先頭位置)となります。