基本情報技術者試験過去問 令和6年度(2024年)科目B問4
次の記述中の に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は1から始まる。
関数mergeは,昇順に整列された整数型の配列data1及びdata2を受け取り,これらを併合してできる昇順に整列された整数型の配列を返す。
関数mergeをmerge({2, 3}, {1, 4})として呼び出すと,/*** α ***/の行は 。
-----------
〔プログラム〕
○整数型の配列: merge(整数型の配列: data1, 整数型の配列: data2)
整数型: n1 ← data1の要素数
整数型: n2 ← data2の要素数
整数型の配列: work ← {(n1+n2)個の未定義の値}
整数型: i ← 1
整数型: j ← 1
整数型: k ← 1
while ((i ≦ n1) and (j ≦ n2))
if (data1[i] ≦ data2[j])
work[k] ← data1[i]
i ← i + 1
else
work[k] ← data2[j]
j ← j + 1
endif
k ← k + 1
endwhile
while (i ≦ n1)
work[k] ← data1[i]
i ← i + 1
k ← k + 1
endwhile
while (j ≦ n2)
work[k] ← data2[j] /*** α ***/
j ← j + 1
k ← k + 1
endwhile
return work
-----------
選択肢
- ア:実行されない
- イ:1回実行される
- ウ:2回実行される
- エ:3回実行される
- ア
- イ
- ウ
- エ
正解と解き方・学習ポイント(AI解説)
merge({2, 3}, {1, 4})では、最初のwhileで1、2、3をworkに格納した時点でdata1の全要素を処理し終えます。その後はdata2の未処理要素が4だけ残るため、最後のwhileが1回だけ実行され、/* ** α ** */の行も1回実行されます。
- ア:不正解
- イ:正解
- ウ:不正解
- エ:不正解
Point
この問題は、整列済み配列のマージ処理で、主ループ終了後に残った配列の要素をコピーする処理が何回実行されるかを確認する問題です。i、j、kがどの条件で増加し、どの時点でwhileが終了するかを追えることがねらいです。
解くために必要な知識
この問題を解くには、整列済み配列のマージ処理(2本の添字で比較しながら統合する処理)と、while条件による繰返し回数の判定が必要です。
用語の整理
| 用語 | 意味 |
|---|---|
| マージ(merge) | 整列済みの2つの配列を比較しながら1つの整列済み配列に併合する処理です。 |
| 要素番号(添字) | 配列の要素を指定する番号です。この問題では1から始まります。 |
| while文 | 条件が成り立つ間、処理を繰り返す制御構文です。 |
マージ処理の基本ルール
主ループで行うこと
-
data1[i] と data2[j] を比較します。
-
小さい方(同じならdata1側)をwork[k]に格納します。
-
格納した側の添字(iまたはj)だけを1増やします。
-
workの添字kは毎回1増やします。
主ループが終了する条件
-
i ≦ n1 が成り立たなくなる(data1を最後まで使い切る)
-
または j ≦ n2 が成り立たなくなる(data2を最後まで使い切る)
主ループ終了後の処理
主ループ終了後は、未処理要素が残っている側の配列を末尾までworkへコピーします。
-
while (i ≦ n1) はdata1の残りをコピーします。
-
while (j ≦ n2) はdata2の残りをコピーします。
このとき、各whileの実行回数は、残っている要素数と一致します。
問題の解法手順
解く手順
1. 初期状態を整理する
-
data1 = {2, 3}、n1 = 2
-
data2 = {1, 4}、n2 = 2
-
i = 1、j = 1、k = 1
2. 1つ目のwhile(両方に要素が残っている間の比較)をトレースする
while条件は (i ≦ n1) and (j ≦ n2) です。
| 回数 | i | j | 比較 data1[i] と data2[j] | work[k] に入る値 | 更新後の i | 更新後の j | 更新後の k |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 2 ≦ 1 は偽 | 1 | 1 | 2 | 2 |
| 2 | 1 | 2 | 2 ≦ 4 は真 | 2 | 2 | 2 | 3 |
| 3 | 2 | 2 | 3 ≦ 4 は真 | 3 | 3 | 2 | 4 |
この結果、i = 3 となり i ≦ n1(3 ≦ 2)が偽になるので、1つ目のwhileは終了します。
3. 2つ目のwhile(data1の残り)を判定する
-
条件は (i ≦ n1)
-
i = 3、n1 = 2 なので 3 ≦ 2 は偽です。
-
よって、2つ目のwhileは1回も実行されません。
4. 3つ目のwhile(data2の残り)をトレースする
-
条件は (j ≦ n2)
-
この時点で j = 2、n2 = 2 なので 2 ≦ 2 は真です。
1回目のループで、次が実行されます。
-
work[k] ← data2[j] (これが「α」の行)
-
その後、j ← j + 1 により j = 3 となります。
次の判定で 3 ≦ 2 は偽になるのでループ終了です。
5. 回数をまとめる
- 「α」の行が実行された回数は1回です。
まとめ
merge({2, 3}, {1, 4})では、最初のwhileで1、2、3をworkに格納した時点でdata1の全要素を処理し終えます。その後はdata2の未処理要素が4だけ残るため、最後のwhileが1回だけ実行され、/* ** α ** */の行も1回実行されます。