科目B

令和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
答えを選ぶ

出典:令和6年度 基本情報技術者試験 科目B 公開問題 問4(問題文は IPA の公開問題。図・数式・下線などはテキストに直して掲載。解説は当サイト作成)

科目Bの解き方と全問の一覧

解説に誤りを見つけたら、解説の誤りを報告してください。

答えと解説を見る

正解:イ

覚える知識

整列済み配列のマージ(併合)処理のトレース

併合は、整列済みの二つの配列の先頭どうしを比べて小さいほうを出していく処理。片方を使い切ったら、もう片方の残りをそのまま後ろに付ける。

この問題で必要なこと

merge({2,3},{1,4}) をトレースする。最初の while では、2 と 1 を比べて 1 を入れ(j=2)、2 と 4 を比べて 2 を入れ(i=2)、3 と 4 を比べて 3 を入れる(i=3)。ここで i > n1 になってループを抜ける。2 番目の while は i=3 > 2 なので実行されない。3 番目の while は j=2 ≦ 2 なので 1 回だけ回り、α の行で 4 を入れる。正解は イ「1 回実行される」。

ひっかけ

ア は data2 の要素をすべて最初のループで使い切ったと思い込んだ誤り。ウ は data2 の 2 要素とも残ると考えた誤り(最初のループで 1 が先に出ている)。エ は回数を多く数えすぎている。