ITの基礎知識|ITパスポート・基本情報

基本情報技術者 令和6年公開問題 科目B 問4

2026.07.08

科目Bに共通する注意事項(表記ルールなど)については、下記のリンク先を参照してください。

基本情報技術者 令和6年公開問題 科目Bの注意事項


問題

次の記述中の空欄に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は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 回実行される

Show answer

解答

解説

merge({2, 3}, {1, 4}) を丁寧にトレースします。

  • data1={2, 3}(n1=2)
  • data2={1, 4}(n2=2)
  • i=j=k=1

からスタートです。

最初の while(両方に未処理要素が残っている間)

  • 1回目:data1[1]=2 と data2[1]=1 を比較。
    2 ≦ 1 は偽 → work[1] ← 1,j=2,k=2
  • 2回目:data1[1]=2 と data2[2]=4 を比較。
    2 ≦ 4 は真 → work[2] ← 2,i=2,k=3
  • 3回目:data1[2]=3 と data2[2]=4 を比較。
    3 ≦ 4 は真 → work[3] ← 3,i=3,k=4
  • 判定:i=3 > n1=2 となり,ループ終了

2番目の while(data1 の残りをコピー)

  • i=3 > n1=2 なので,1回も実行されません。

3番目の while(data2 の残りをコピー)── α の行

  • j=2 ≦ n2=2 なので実行:
    work[4] ← data2[2]=4,j=3,k=5 ←【αの1回目】
  • 判定:j=3 > n2=2 となり,ループ終了

α の行が実行されたのは 1回(イ) です。work は {1, 2, 4} … ではなく {1, 2, 3, 4} となり,正しく併合されています。

このプログラムはマージソートの核となる併合処理です。

「両方を先頭から比較して小さい方を取り出し,どちらかが尽きたら残りを丸ごとコピーする」という構造と,後半の while がどちらか一方しか実行されない(今回は data1 側が 0 回,data2 側が 1 回)ことを理解しておきましょう。