過去問解きまくり研究所 ホーム

令和6年度 科目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回実行される

解説

data2の4だけが最後に残るので、αの行は1回実行されます。

関数mergeは、昇順に並んだ二つの配列を併合する関数です。先頭どうしを比べて小さい方をworkへ移すことを繰り返し、片方を使い切ると最初のwhileを抜け、残った側の要素を後ろの二つのwhileでそのまま写します。/* α */ はdata2の残りを写す行なので、軸になるのは、最初のwhileを抜けた時点でdata2に何個の要素が残っているかです。

merge({2, 3}, {1, 4}) で追います。n1=2、n2=2、i、j、kは全て1です。1回目は data1[1]の2と data2[1]の1を比べ、2 ≦ 1 は偽なのでwork[1]に1を入れ、jは2になります。2回目は2と4を比べて真なので、work[2]に2を入れてiは2。3回目は3と4を比べて真なので、work[3]に3を入れてiは3になります。ここで i ≦ n1 が偽となり、最初のwhileを抜けます。

次の while (i ≦ n1) は条件が偽なので一度も回りません。最後の while (j ≦ n2) は j=2 で真なので、work[4]に4を入れ、jは3になって終わります。αの行が実行されたのはこの1回だけで、workは{1, 2, 3, 4}となり、正しく整列されています。

見分け方は、最初のwhileを抜けた時点のiとjを書き留め、data2の側で残っている要素の数を数えることです。

ほかの選択肢はなぜ違うのか

出典:令和6年度 基本情報技術者試験 科目B 問4

この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)