令和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回実行される
- ウ2回実行される
- エ3回実行される
答えと解説を見る
✓ これが正解イ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の側で残っている要素の数を数えることです。
ほかの選択肢はなぜ違うのか
- ア実行されない:αの行が一度も実行されないのは、data2を先に使い切った場合です。今回はdata1の3が4より先に移るので、最初のwhileを抜けた時点でdata2の4が残っており、少なくとも1回は実行されます。
- ウ2回実行される:2回になるのは、data2の二つの要素がどちらも最後まで残る場合です。今回はdata2の先頭の1がdata1の2より小さく、最初の比較でworkへ移ってしまうので、残るのは4の一つだけです。
- エ3回実行される:αの行はdata2の要素を1個写すごとに1回実行されるので、要素が2個しかないdata2では多くても2回です。3回という回数は、この呼出しではどう追っても生じません。
出典:令和6年度 基本情報技術者試験 科目B 問4
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)