基本情報技術者

問4

基本情報技術者試験過去問 令和6年度(2024年)科目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回実行される

正解と解き方・学習ポイント(AI解説)

正解:
あなたの回答:未回答

merge({2, 3}, {1, 4})では、最初のwhileで1、2、3をworkに格納した時点でdata1の全要素を処理し終えます。その後はdata2の未処理要素が4だけ残るため、最後のwhileが1回だけ実行され、/* ** α ** */の行も1回実行されます。

不正解
正解
不正解
不正解

Point

この問題は、整列済み配列のマージ処理で、主ループ終了後に残った配列の要素をコピーする処理が何回実行されるかを確認する問題です。i、j、kがどの条件で増加し、どの時点でwhileが終了するかを追えることがねらいです。

解くために必要な知識

この問題を解くには、整列済み配列のマージ処理(2本の添字で比較しながら統合する処理)と、while条件による繰返し回数の判定が必要です。

用語の整理

用語 意味
マージ(merge) 整列済みの2つの配列を比較しながら1つの整列済み配列に併合する処理です。
要素番号(添字) 配列の要素を指定する番号です。この問題では1から始まります。
while文 条件が成り立つ間、処理を繰り返す制御構文です。

マージ処理の基本ルール

主ループで行うこと

  • data1[i] と data2[j] を比較します。

  • 小さい方(同じならdata1側)をwork[k]に格納します。

  • 格納した側の添字(iまたはj)だけを1増やします。

  • workの添字kは毎回1増やします。

主ループが終了する条件

  • i ≦ n1 が成り立たなくなる(data1を最後まで使い切る)

  • または j ≦ n2 が成り立たなくなる(data2を最後まで使い切る)

主ループ終了後の処理

主ループ終了後は、未処理要素が残っている側の配列を末尾までworkへコピーします。

  • while (i ≦ n1) はdata1の残りをコピーします。

  • while (j ≦ n2) はdata2の残りをコピーします。

このとき、各whileの実行回数は、残っている要素数と一致します。

問題の解法手順

解く手順

1. 初期状態を整理する

  • data1 = {2, 3}、n1 = 2

  • data2 = {1, 4}、n2 = 2

  • i = 1、j = 1、k = 1

2. 1つ目のwhile(両方に要素が残っている間の比較)をトレースする

while条件は (i ≦ n1) and (j ≦ n2) です。

回数 i j 比較 data1[i] と data2[j] work[k] に入る値 更新後の i 更新後の j 更新後の k
1 1 1 2 ≦ 1 は偽 1 1 2 2
2 1 2 2 ≦ 4 は真 2 2 2 3
3 2 2 3 ≦ 4 は真 3 3 2 4

この結果、i = 3 となり i ≦ n1(3 ≦ 2)が偽になるので、1つ目のwhileは終了します。

3. 2つ目のwhile(data1の残り)を判定する

  • 条件は (i ≦ n1)

  • i = 3、n1 = 2 なので 3 ≦ 2 は偽です。

  • よって、2つ目のwhileは1回も実行されません。

4. 3つ目のwhile(data2の残り)をトレースする

  • 条件は (j ≦ n2)

  • この時点で j = 2、n2 = 2 なので 2 ≦ 2 は真です。

1回目のループで、次が実行されます。

  • work[k] ← data2[j] (これが「α」の行)

  • その後、j ← j + 1 により j = 3 となります。

次の判定で 3 ≦ 2 は偽になるのでループ終了です。

5. 回数をまとめる

  • 「α」の行が実行された回数は1回です。

まとめ

merge({2, 3}, {1, 4})では、最初のwhileで1、2、3をworkに格納した時点でdata1の全要素を処理し終えます。その後はdata2の未処理要素が4だけ残るため、最後のwhileが1回だけ実行され、/* ** α ** */の行も1回実行されます。

順次、単語を追加予定です。もうしばらくお待ちください。