はじめに
試験問題に取り組んでいて、何気なく「merge関数の動作」を問う問題を見たことがあるだろうか?
一見、単純な処理のように思えるが、実際にコードを読み解いてみると奥が深い。
今回は、令和6年公開問題の科目Bに出題された問4「merge関数の動作」について考えてみよう。
「このコードのどこがポイントなのか?」を整理しながら、問題の答えを導き出してみよう。
merge関数の動作を解析する
問題の設定
与えられた関数 merge は、昇順に整列された2つの整数型配列 data1
と data2
を統合し、新しい昇順配列を作成する。
問題では、次のような呼び出しが行われる。
merge({2, 3}, {1, 4})
ここで、特定の行 /* α */
が何回実行されるかを求める問題だ。
merge関数の処理
この関数は、以下の手順で処理を行う。
work
という新しい配列を作成(data1
とdata2
の要素数の合計)- 2つの配列を昇順に併合するため、比較しながら
work
に格納 - どちらかの配列が処理し終わったら、残りの要素をそのまま
work
に格納
特に注目すべきは、while
ループの処理フローだ。
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
このループでは、data1
と data2
の要素を比較し、work
に格納していく。
もし data1[i]
の方が小さければ data1[i]
を、そうでなければ data2[j]
を work
に追加する。
このループが終了した後、data1
または data2
に残った要素を追加する処理が続く。
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
この while (j ≦ n2)
の部分で /* α */
の行が実行される回数を求めるのが、この問題のポイントだ。
実際に処理をシミュレーション
では、merge({2, 3}, {1, 4})
の具体的な動きをシミュレーションしてみる。
初期値
data1 = {2, 3} (n1 = 2)
data2 = {1, 4} (n2 = 2)
work = {未定義, 未定義, 未定義, 未定義}
i = 1, j = 1, k = 1
比較ループの実行
- 1回目:
data1[1] (2)
とdata2[1] (1)
を比較
– 1
の方が小さいため、work[1] = 1
– j=2
, k=2
- 2回目:
data1[1] (2)
とdata2[2] (4)
を比較
– 2
の方が小さいため、work[2] = 2
– i=2
, k=3
- 3回目:
data1[2] (3)
とdata2[2] (4)
を比較
– 3
の方が小さいため、work[3] = 3
– i=3
, k=4
この時点で i=3
となり、data1
の全要素が処理されたため、最初の while
ループが終了する。
残りの要素を処理
次に data2
に残った要素を work
に格納する。
while (j ≦ n2)
work[k] ← data2[j] /* α */
j ← j + 1
k ← k + 1
endwhile
この while
ループに入る前の状態は以下の通り。
j = 2, k = 4, n2 = 2
ここで j ≦ n2
は 真 なので、ループを1回実行する。
work[4] = data2[2] (4)
j=3
,k=5
ここで j=3
となり、j ≦ n2
は 偽 になるため、ループが終了する。
したがって、/* α */
の行は 1回実行される。
答えは 「イ 1回実行される」 となる。
まとめ
今回の問題は、一見単純な配列の併合処理に見えるが、実際には処理の流れを細かく把握する必要がある。
特に while
ループの終了条件や i
、j
の値がどのタイミングで変わるのかを意識すると、コードの動きが明確になる。
基本情報技術者試験の問題を解く上で、こうした逐次的なシミュレーションを行うのは非常に有効だ。
アルゴリズムを暗記するだけでなく、どのように動作するのか をしっかり理解しておくことが、本当の意味での「プログラム理解」につながる。
今後も、試験問題を解く際には「コードを読んで、実際の動きを手でトレースする」ことを意識したい。
配列の処理に苦手意識があるなら、一度じっくり手を動かして、納得できるまでシミュレーションしてみてほしい。
コメント