基本情報技術者試験 令和6年度 科目B 公開問題(過去問) 問4 について解説します。
問題
問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回実行される
解説・解答
プログラムは下記の3つの部分に分けられます。
① 先頭の while ((i ≤ n1) and (j ≤ n2)) の部分
両配列に未処理要素がある間だけ、data1[i] と data2[j] を比較し、小さい方(等しければ data1側)を work[k] に書き出す。
② 次の while (i ≤ n1) の部分
data1 側の残りを work[k] に一気に書き出す。
③ 最後の while (j ≤ n2) の部分 (ここに /*** α ***/ があり)
data2 側の残りを work[k] に一気に書き出す。
つまり /*** α ***/ は、data2 にだけ残りがあるときに、その残り要素の個数分だけ実行されます。
merge({2, 3}, {1, 4}) として呼び出した場合、上記①の部分をトレースすると次のようになります。
【1回目のループ】
data1[1] = 2 と data2[1] = 1 の比較となり、data2[1] の方が小さいので else節 に行って以下を実施。
work[1] ← data2[1] (= 1)
j ← j + 1 (= 1 + 1= 2)
その後に k ← k + 1 (= 1 + 1= 2)
1回目のループの終了時は i = 1, j = 2, k = 2 となります。
【2回目のループ】
data1[1] = 2 と data2[2] = 4 の比較となり、data1[1] の方が小さいので if節 に行って以下を実施。
work[2] ← data1[1] (= 2)
i ← i + 1 (= 1 + 1= 2)
その後に k ← k + 1 (= 2 + 1= 3)
2回目のループの終了時は i = 2, j = 2, k = 3 となります。
【3回目のループ】
data1[2] = 3 と data2[2] = 4 の比較となり、data1[2] の方が小さいので if節 に行って以下を実施。
work[3] ← data1[2] (= 3)
i ← i + 1 (= 2 + 1= 3)
その後に k ← k + 1 (= 3 + 1= 4)
3回目のループの終了時は i = 3, j = 2, k = 4 となります。
ここで i=3 となり i ≤ n1 (= 2) が 偽になったため、上記①の while を抜けます。
この時点で data1 はすべて処理済み、data2 は 要素2(= 4)が未処理で残っている状態です。
プログラムの上記②の while (i ≤ n1) の部分は、i = 3、n1 = 2 なので i ≤ n1 は偽になるため実行されません。
プログラムの上記③の while (j ≤ n2) の部分は、j = 2、n2 = 2 なので j ≤ n2 は真になるため実行されます。1回実行された後、j = 3 となるため j ≤ n2 は偽になるため2回目は実行されず、1回の実行で終了します。この while (j ≤ n2) の部分に /*** α ***/ の行はありますので、この行は1回実行されることになります。
以上により、この問題の解答は「イ」になります。
