基本情報技術者試験過去問 令和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回です。
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回です。
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 回の評価になります。真の回数ではなく、評価回数や数え方を取り違えた可能性があります。よって誤りです。