2026年 共通テスト情報Ⅰ 第3問 解説|文化祭のゲーム待ち時間シミュレーション(関数「最大値」と条件付きの繰り返し)
正解と配点
| 設問 | 解答記号 | 正解 | 配点 |
|---|---|---|---|
| 問1 | ア・イ・ウ | 9・2・4すべて正解で3点 | 3 |
| 問1 | エ | ③ | 1 |
| 問1 | オ | ⓪ | 1 |
| 問2 | カ・キ | ①・②順序は問わない。各2点 | 4 |
| 問2 | ク | ⑤ | 2 |
| 問2 | ケ | ② | 2 |
| 問2 | コ | ② | 2 |
| 問3 | サ | ③ | 2 |
| 問3 | シ | ② | 2 |
| 問3 | ス | ⓪ | 2 |
| 問3 | セ | ② | 2 |
| 問3 | ソ | 5 | 2 |
丸数字(②など)は選択肢の番号です。
第3問は、共通テスト用プログラム表記で書かれたプログラムを読み、空欄を埋める問題です。題材は「文化祭で展示するゲームの待ち時間」。来訪者が順番に1人ずつゲームを体験するとき、体験時間を変えると待ち時間がどう変わるかを調べる、シミュレーションの問題でした。
前年の第3問より、プログラムの考え方そのものはシンプルです。そのぶん、問1で手計算した規則をそのままプログラムに置き換えられるか、問3で繰り返しの条件と初期化の位置を正しく考えられるかが問われました。
問題の設定
- プログラミング部は文化祭でゲームを1点展示し、来訪者は到着した順に1人ずつ体験する
- 同じ時刻に到着する来訪者はいない。交替にかかる時間は考えない
- 体験時間は全員同じで、昨年は1人3分間だった
- 昨年の来訪者6人の到着時刻(1人目の到着を0分とする)は 0, 3, 4, 10, 11, 12分
問1 待ち時間の求め方(ア〜オ)
場面: 図1は、縦軸に来訪者(到着順)、横軸に時刻(0〜20分)をとり、体験時間と待ち時間を矢印で表した図です。3人目までが描かれていました。
- 1人目:0分に到着し、すぐ体験(0〜3分)
- 2人目:3分に到着。1人目がちょうど終わったので、待たずに体験(3〜6分)
- 3人目:4分に到着したが、2人目が6分まで体験中なので、2分間待って6〜9分に体験
ア・イ・ウ:表1の空欄
正解:ア 9 イ 2 ウ 4
6人目まで、同じ考え方で表を完成させます(太字が空欄・“?”で隠されていた部分)。
| 来訪者 | 到着時刻 | 開始時刻 | 終了時刻 | 待ち時間 |
|---|---|---|---|---|
| 1人目 | 0 | 0 | 3 | 0 |
| 2人目 | 3 | 3 | 6 | 0 |
| 3人目 | 4 | 6 | 9(ア) | 2 |
| 4人目 | 10 | 10 | 13 | 0 |
| 5人目 | 11 | 13 | 16 | 2(イ) |
| 6人目 | 12 | 16 | 19 | 4(ウ) |
4人目は10分に到着し、3人目は9分に終わっているので待ちません。5人目は11分に着きますが4人目が13分まで体験中なので2分待ち、6人目は12分に着いて5人目が終わる16分まで4分待ちます。
エ・オ:開始時刻の規則
問われたこと: 表1から確認した、2人目以降の規則の空欄。
- 開始時刻は「(エ)より遅く到着した場合には(オ)、それ以外の場合は(エ)」
- 終了時刻は「本人の開始時刻+体験時間」
- 待ち時間は「本人の開始時刻と(オ)の差」
選択肢は「本人の到着時刻/直前の来訪者の到着時刻/本人の終了時刻/直前の来訪者の終了時刻」でした。
正解:エ ③ 直前の来訪者の終了時刻 オ ⓪ 来訪者本人の到着時刻
前の人が終わった後に着いたなら、着いた時刻にすぐ始められます。前の人がまだ体験中なら、前の人が終わった時刻に始まります。つまり**開始時刻=「本人の到着時刻」と「直前の人の終了時刻」の遅い方(大きい方)**です。待ち時間は、開始時刻から到着時刻を引いた値です。
問2 待ち時間を表示するプログラム(カ〜コ)
プログラムの設定(図2):
- 変数 taiken は体験時間(昨年の3分)
- 配列 Touchaku・Kaishi・Shuryou に、各来訪者の到着時刻・開始時刻・終了時刻を入れる。添字は1から始まり、到着順を表す
- 関数「要素数(配列)」は配列の要素数を返し、関数「最大値(x, y)」は2つの値の大きい方を返す(例:最大値(1, 5) は 5、最大値(2, 2) は 2)
- (06)行目で1人目の終了時刻を設定し、(07)〜(10)行目の繰り返しで、2人目以降の開始時刻・終了時刻を求めて待ち時間を表示する
正解:カ・キ ① Shuryou[i − 1] と ② Touchaku[i](順序は問わない) ク ⑤ Kaishi[i] + taiken ケ ② Kaishi[i] コ ② Touchaku[i]
問1の規則を、そのままプログラムに置き換えます。
| 規則 | プログラム |
|---|---|
| 開始時刻=本人の到着時刻と直前の人の終了時刻の大きい方 | Kaishi[i] = 最大値(Shuryou[i − 1], Touchaku[i]) |
| 終了時刻=開始時刻+体験時間 | Shuryou[i] = Kaishi[i] + taiken |
| 待ち時間=開始時刻−到着時刻 | Kaishi[i] − Touchaku[i] |
(01) taiken = 3
(02) Touchaku = [0, 3, 4, 10, 11, 12]
(03) kyakusu = 要素数(Touchaku)
(04) Kaishi = [0, 0, 0, 0, 0, 0]
(05) Shuryou = [0, 0, 0, 0, 0, 0]
(06) Shuryou[1] = taiken
(07) i を 2 から kyakusu まで 1 ずつ増やしながら繰り返す:
(08) | Kaishi[i] = 最大値(Shuryou[i - 1], Touchaku[i])
(09) | Shuryou[i] = Kaishi[i] + taiken
(10) ⎿ 表示する(i, "人目の待ち時間:", Kaishi[i] - Touchaku[i], "分間")
「直前の人」は添字 i − 1 で表します。カ・キの選択肢には Touchaku[i − 1](直前の人の到着時刻)や Shuryou[i](本人の終了時刻。まだ計算していない)もあるので、どの人の、どの時刻かを1つずつ確かめましょう。(06)行目で1人目の終了時刻を先に入れているのは、i = 2 のときに Shuryou[1] を使うためです。
問3 最長待ち時間が10分未満になる体験時間(サ〜ソ)
場面: Yさんは、来訪者を10分以上待たせたくないと考え、最長待ち時間(最も長く待つ人の待ち時間)が10分未満になる体験時間を調べるプログラム(図3)を作りました。
図3のプログラムの流れ:
- (03)行目:taiken を1から15まで1ずつ増やしながら繰り返す
- (04)〜(09)行目:配列を初期化して、図2と同じ方法で全員の開始時刻・終了時刻を求める
- (10)〜(12)行目:saichou を0にしてから、全員の待ち時間の最大値を求める
- (13)〜(14)行目:saichou が条件を満たせば、体験時間と最長待ち時間を表示する
- 図3には、挿入位置の候補として ⓪(02)行目と(03)行目の間(繰り返しの前)、①(03)行目の繰り返しの先頭、②(03)行目の繰り返しの末尾((14)行目の後)、③繰り返しの後ろ の4か所に印が付いていました
サ・シ:最長待ち時間の計算と表示の条件
正解:サ ③ saichou シ ② saichou < 10
(12)行目は saichou = 最大値(saichou, Kaishi[i] − Touchaku[i]) です。「これまでの最大」と「i 番目の人の待ち時間」の大きい方で saichou を更新していくと、繰り返しが終わったときに saichou が全員の中の最大値になります。(10)行目で saichou を0に戻しているのは、体験時間ごとに最大値を求め直すためです。
表示するのは最長待ち時間が10分未満のときなので、条件は saichou < 10 です。実行結果(図4)は次のとおりでした。
| 体験時間 | 各来訪者の待ち時間(1〜6人目) | 最長待ち時間 | 表示 |
|---|---|---|---|
| 1分 | 0, 0, 0, 0, 0, 0 | 0分 | される |
| 2分 | 0, 0, 1, 0, 1, 2 | 2分 | される |
| 3分 | 0, 0, 2, 0, 2, 4 | 4分 | される |
| 4分 | 0, 1, 4, 2, 5, 8 | 8分 | される |
| 5分 | 0, 2, 6, 5, 9, 13 | 13分 | されない |
体験時間が長くなるほど待ち時間は増えるので、5分で10分以上になったら、6分以上を調べる必要はありません。
ス・セ・ソ:10分以上になったら止めるように書き換える
書き換えの内容: (03)行目を「(taiken <= 15) and (saichou < 10) の間繰り返す:」に変え、「taiken = 1」と「saichou = 0」を(ス)の位置に、「taiken = taiken + 1」を(セ)の位置に入れる。
正解:ス ⓪(繰り返しの前) セ ②(繰り返しの末尾) ソ 5回
「〜の間繰り返す」は、繰り返しの先頭で条件を調べるので、最初に条件を調べる前に taiken と saichou に値が入っていなければなりません。だから2つの代入は**繰り返しの前(⓪)**です。saichou = 0 を入れておけば、最初の条件 saichou < 10 が真になり、繰り返しが始まります。
taiken = taiken + 1 は、1回分の計算と表示が終わってから次の体験時間に進むために、**繰り返しの末尾(②)**に置きます。先頭(①)に置くと、最初の計算が taiken = 2 から始まってしまいます。
(01) Touchaku = [0, 3, 4, 10, 11, 12]
(02) kyakusu = 要素数(Touchaku)
taiken = 1
saichou = 0
(03) (taiken <= 15) and (saichou < 10) の間繰り返す:
(04) | Kaishi = [0, 0, 0, 0, 0, 0]
| ……((05)〜(14)行目は変更なし)……
⎿ taiken = taiken + 1
ソ: 書き換え後に配列 Kaishi を初期化する回数を数えます。
| 繰り返しの回 | taiken | 条件(調べる時点の saichou) | 計算後の saichou |
|---|---|---|---|
| 1回目 | 1 | 0 < 10 → 実行 | 0 |
| 2回目 | 2 | 0 < 10 → 実行 | 2 |
| 3回目 | 3 | 2 < 10 → 実行 | 4 |
| 4回目 | 4 | 4 < 10 → 実行 | 8 |
| 5回目 | 5 | 8 < 10 → 実行 | 13 |
| 6回目 | 6 | 13 < 10 は偽 → 終了 | — |
最長待ち時間が10分以上になる taiken = 5 の回も、計算してから初めて分かるので実行されます。初期化は 1〜5 の 5回です。「表示されたのは4回だから4回」としないように注意しましょう。
第3問のまとめ
- シミュレーションのプログラムは、問1で作った表と規則をそのまま式にすれば書けます。手計算の表を丁寧に作ることが近道です。
- 「2つの大きい方」は関数「最大値」、「全員の中の最大値」は変数を0から更新していく、という使い分けを押さえましょう。
- 条件付きの繰り返しに書き換えるときは、条件に使う変数を繰り返しの前で初期化すること、次に進む処理は繰り返しの末尾に置くことが定番の考え方です。
- 実行回数を問われたら、条件が偽になる「最後の1回」を含めるかどうかを、表を作って確かめると確実です。