基本情報技術者試験 科目Bの「令和7年度 サンプル問題 問4」(FOR のネスト・文字列の並び探索)を、図解トレースで解説します。真になった回数を数える問題なので、関係の無いトレースを割愛するのがポイントです。
動画で見たい方はこちら▼
問題(令和7年度 サンプル問題 問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
本番さながらの環境で解いてみたい方はこちら↓
解説
正解は ク 8 です。
①トレース表の作成
data
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|
| a | b | a | b | c | a | b | c |
Point: ここで間違えると絶対に正解できない
data の配列表を間違えると、このあとどれだけ頑張っても正解にたどり着けません。焦らず丁寧に、「えー、びー、えー、びー…」と小声で唱えながら書くと間違えにくいです。
key
| 1 | 2 | 3 |
|---|---|---|
| a | b | c |
トレース表(繰り返し条件は書く時点で計算して具体値を入れます)
| i (1~6) | j (1~3) | lenData | lenKey | if(data[i + j – 1] = key[j]) |
|---|---|---|---|---|
| 8 | 3 |
②条件判定しながらトレース
if (data[i + j − 1] が key[j] と等しい) が false の場合、else で α の行から始まる内側の繰り返しが終了 します。そのため、都度判定しながら進めます。
for (j を 1 から lenKey まで 1 ずつ増やす)
if (data[i + j − 1] が key[j] と等しい) /*** β ***/
//(省略可能)
else
α の行から始まる繰返し処理を終了する
endif
endfor
最後までトレースすると次のとおり。
| i (1~6) | j (1~3) | data[i + j – 1] = key[j] |
|---|---|---|
| 1 | ||
| 1 | data[ 1 a a ○ |
|
| 2 | data[ 2 b b ○ |
|
| 3 | data[ 3 a c × |
|
| 2 | ||
| 1 | data[ 2 b a × |
|
| 3 | ||
| 1 | data[ 3 a a ○ |
|
| 2 | data[ 4 b b ○ |
|
| 3 | data[ 5 c c ○ |
|
| 4 | ||
| 1 | data[ 4 b a × |
|
| 5 | ||
| 1 | data[ 5 c a × |
|
| 6 | ||
| 1 | data[ 6 a a ○ |
|
| 2 | data[ 7 b b ○ |
|
| 3 | data[ 8 c c ○ |
data[i + j - 1] = key[j] が真となった回数は 8回(ク)です。
Point: より効率的にトレースする(やや上級者向け)
data[i + j − 1] = key[j] は、a→b→c の順になっているかを判定し、×になったら再び a から判定しています。
つまり、data 内で a→b→c と頭から連続で一致している文字数(途中まででもOK)が、○となる数です。
i の1周目あたりでそれに気づければ、○になるのは以下のタイミングだとわかります。
data
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|
| a | b | a | b | c | a | b | c |
| ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
よって真となる回数は 8回(上記の○の数)です。
Point: 値を変えてトレースしてみよう
呼び出す際の引数を変えてトレースすると、よい練習になります。 数え方はメインと同じで、data 内で各開始位置から key と頭から連続一致した文字数(途中まででもOK)の合計=○の数です。
A:正解は6回
search({“a”,”c”,“a”,”b”,“a”,”b”,”c”,”c”}, {“a”,”b”,”c”})
B:正解は6回
search({“a”,”b”,“a”,”b”,”c”,“a”,”b”,”c”}, {“a”,”b”})
まとめ
素早く正確にトレースできるか、の集大成となる問題です。トレースがうまくできなかった方は、より簡単な問題で練習しましょう。
関連リンク

関連動画
FORのネストの基礎から学べる、同じ章の動画です。
講座の全動画はこちら(プレイリスト)。
6/30まで限定 無料プレゼント
サンプル問題だけ解いても、
合格できません
サンプル問題は応用ばかり。学習には不向きで、非効率です。段階的に学べるオリジナル問題50問を加えた学習専用サイトを、今だけ無料でプレゼント中
⏱ 2分で終わるアンケートに答えるだけ!
▶ アンケートに答えてサイトを受け取る
※ Googleフォーム(SSL)に移動します

