PR

基本情報技術者試験 令和6年度 科目B 公開問題(過去問) 問4 解説

基本情報技術者試験 令和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回実行されることになります。

以上により、この問題の解答は「イ」になります。