問4 併合の処理で残りを写す回数

基本情報​技術者試験 令和6年度 公開問題 科目B、全6問のうちの問4。

出典:令和6年度 基本情報技術者試験 公開問題 科目B 問4(プログラムは原本の画像を文字に書き起こし、字下げは 1 段を空白 2 つで表した。空欄は[  ]で表した)

次の記述中の[  ]に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は 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. イ1 回実行される
  3. ウ2 回実行される
  4. エ3 回実行される
答えと解説を開く

正解はイです。

n1 = 2、n2 = 2 で、i、j、k は 1 から始まります。最初の while は、両方にまだ要素がある間、小さいほうを work に写します。data1[1] = 2 と data2[1] = 1 を比べ、2 ≦ 1 は偽なので work[1] ← 1、j = 2、k = 2 です。次に 2 と data2[2] = 4 を比べ、2 ≦ 4 は真なので work[2] ← 2、i = 2、k = 3 です。3 と 4 を比べ、3 ≦ 4 は真なので work[3] ← 3、i = 3、k = 4 です。i = 3 は n1 = 2 を超えたので最初の while を抜けます。2 つ目の while (i ≦ n1) は 3 ≦ 2 が偽なので 1 回も回りません。3 つ目の while (j ≦ n2) は 2 ≦ 2 が真なので、α の行で work[4] ← 4 を実行し、j = 3 になって抜けます。α の行は 1 回だけ実行され、work は {1, 2, 3, 4} です。正解はイです。

ほかの選択肢が違う理由

  • アdata2 の 4 は最初の while では写されずに残ります。残りを写す 3 つ目の while で α の行が実行されます。
  • ウ最初の while の中で data2 の 1 を写した分を数えています。α の行は 3 つ目の while の中だけにあり、data2 の 1 はそこを通りません。
  • エdata2 の要素は 2 つしかないので、α の行が 3 回実行されることはありません。

仕組み

併合 (マージ) は、整列済みの 2 つの並びの先頭どうしを比べ、小さいほうから順に取り出して 1 つの並びにする処理です。マージソートの中心になる処理です。

片方を使い切ったら、もう片方の残りはすでに整列しているので、比べずにそのまま後ろへ写します。2 つ目と 3 つ目の while がその役で、どちらか一方しか回りません。

この問に出る言葉