基本情報技術者

問4

基本情報技術者試験過去問 令和7年度(2025年)科目B問4

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

関数searchは,二つの文字型の配列を,それぞれ引数data及びkeyで受け取り,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

正解と解き方・学習ポイント(AI解説)

正解:
あなたの回答:未回答

dataの各開始位置i(1からlenData - lenKey + 1まで)について、key[1]から順に比較します。data[i + j - 1] = key[j] が一致した回数だけ条件式は真になり、途中で不一致になるとその開始位置の比較は打ち切られます。与えられたdataとkeyでは、真になる回数の合計は8回です。

不正解

i=3とi=6でそれぞれ3回ずつ真になります(合計6回)。さらにi=1でも2回真になるため、合計は8回となり、1回にはなりません。よって誤りです。

不正解

i=3とi=6でそれぞれ3回ずつ真になり、これだけで6回です。さらにi=1でも2回真になるため、2回にはなりません。よって誤りです。

不正解

i=3の3回だけを数えた場合の値です。i=1とi=6でもβが真になるため不足します。よって誤りです。

不正解

i=1で2回真になり、i=3とi=6でそれぞれ3回真になります。合計は8回なので、4回にはなりません。よって誤りです。

不正解

i=1で2回、i=3で3回、i=6で3回が真になり、合計は8回です。5回にはなりません。よって誤りです。

不正解

i=3とi=6だけで真が6回あり、さらにi=1でも2回真になるため、合計は8回です。6回にはなりません。よって誤りです。

不正解

真になる回数は i=1で2回、i=3で3回、i=6で3回の合計8回です。7回にはなりません。よって誤りです。

正解

i=1で先頭2回が一致して真2回、i=3とi=6は3要素すべて一致してそれぞれ真3回です。合計は2+3+3=8回となります。よって正解です。

不正解

不一致になった後も内側ループが続くと誤解した場合などに増えやすい値です。実際は不一致で内側ループが終了します。よって誤りです。

不正解

途中終了を考慮せず、全iでj=1から3まで評価してしまうと 6×3=18 回の評価になります。真の回数ではなく、評価回数や数え方を取り違えた可能性があります。よって誤りです。

Point

この問題は、二重ループで行う部分配列探索において、比較結果が真になる回数を数えられるかを確認しています。内側ループが不一致で終了する点を踏まえて、開始位置ごとに一致が続いた回数を合計します。

解くために必要な知識

の問題を解くには、配列の添字(要素番号)の扱い、for文の繰返し、if文の分岐、途中終了を含むトレースが必要です。

用語の整理

用語 意味
配列 同じ型の値を並べて格納し、要素番号で参照するデータ構造です。
要素番号 配列の位置を表す番号です。この問題では1から始まります。
トレース プログラムの実行順に、変数や条件判定の結果を追って確認する作業です。
二重ループ for文の中にfor文があり、外側と内側の2段階で繰返す構造です。
途中終了 条件により繰返し処理を途中で終えることです。この問題では不一致時に内側ループが終了します。

解くための手順

1. ループ範囲を確定する

  • 外側ループの回数は i = 1 から (lenData - lenKey + 1) です。

  • lenDataとlenKeyを先に求めます。

2. 比較位置の計算式を確認する

  • data側の参照位置は i + j - 1 です。

  • key側の参照位置は j です。

  • したがって、比較は data[i] と key[1] から始まり、1つずつ右にずれます。

3. 真の回数だけを数える

  • βの条件式が真になったときのみカウントします。

  • 偽になった場合は内側ループが終了するため、そのiの残りは数えません。

4. iごとに集計して合計する

  • iごとの真の回数を出し、最後に合計します。

問題の解法手順

この問題は、βの条件式が真になった回数だけを数えます。不一致になった場合は、そのiについて内側ループ(j)が終了する点が重要です。

解く手順

1. 配列と長さ、iの範囲を整理する

  • data = {"a", "b", "a", "b", "c", "a", "b", "c"}

  • key = {"a", "b", "c"}

  • lenData = 8

  • lenKey = 3

  • i の範囲 = 1 から (lenData - lenKey + 1) = 1 から 6

2. βの条件式が評価される場面を確認する

  • βの条件式: data[i + j - 1] が key[j] と等しい

  • これが真になった回数を、iごとに合計します。

  • 偽になったら、そのiでの以降のjは実行されません。

3. iごとにトレースして、真の回数を数える

i 比較の流れ(j=1から) βが真になった回数
1 a=a(真), b=b(真), a=c(偽で終了) 2
2 b=a(偽で終了) 0
3 a=a(真), b=b(真), c=c(真) 3
4 b=a(偽で終了) 0
5 c=a(偽で終了) 0
6 a=a(真), b=b(真), c=c(真) 3

4. 合計する

  • 合計 = 2 + 0 + 3 + 0 + 0 + 3 = 8

よって、βの条件式が真になる回数は8回です。

選択肢ごとの解説

不正解

i=3とi=6でそれぞれ3回ずつ真になります(合計6回)。さらにi=1でも2回真になるため、合計は8回となり、1回にはなりません。よって誤りです。

不正解

i=3とi=6でそれぞれ3回ずつ真になり、これだけで6回です。さらにi=1でも2回真になるため、2回にはなりません。よって誤りです。

不正解

i=3の3回だけを数えた場合の値です。i=1とi=6でもβが真になるため不足します。よって誤りです。

不正解

i=1で2回真になり、i=3とi=6でそれぞれ3回真になります。合計は8回なので、4回にはなりません。よって誤りです。

不正解

i=1で2回、i=3で3回、i=6で3回が真になり、合計は8回です。5回にはなりません。よって誤りです。

不正解

i=3とi=6だけで真が6回あり、さらにi=1でも2回真になるため、合計は8回です。6回にはなりません。よって誤りです。

不正解

真になる回数は i=1で2回、i=3で3回、i=6で3回の合計8回です。7回にはなりません。よって誤りです。

正解

i=1で先頭2回が一致して真2回、i=3とi=6は3要素すべて一致してそれぞれ真3回です。合計は2+3+3=8回となります。よって正解です。

不正解

不一致になった後も内側ループが続くと誤解した場合などに増えやすい値です。実際は不一致で内側ループが終了します。よって誤りです。

不正解

途中終了を考慮せず、全iでj=1から3まで評価してしまうと 6×3=18 回の評価になります。真の回数ではなく、評価回数や数え方を取り違えた可能性があります。よって誤りです。

まとめ

dataの各開始位置i(1からlenData - lenKey + 1まで)について、key[1]から順に比較します。data[i + j - 1] = key[j] が一致した回数だけ条件式は真になり、途中で不一致になるとその開始位置の比較は打ち切られます。与えられたdataとkeyでは、真になる回数の合計は8回です。

順次、単語を追加予定です。もうしばらくお待ちください。