✏️第3問-問2を一緒に解答しよう

ここからは、第3問の問2を確認していきましょう。

問2は、問1で整理した「開始時刻・終了時刻・待ち時間」の考え方を、プログラムで表す問題です。

いよいよプログラムですね。

図や表なら追えたけど、コードになると急に難しく見えます。

でも、問1でやった計算をプログラムに置きかえているだけなら、順番に見れば分かりそうです。

その通りです。今回は、プログラムを読む前に、まず「何を計算したいのか」を確認しましょう。

大切なのは、開始時刻・終了時刻・待ち時間の求め方です。

ポイント

プログラム問題では、いきなり空欄だけを見るのではなく、「その行で何を求めているのか」を先に考えます。

問2の問題

今回の出題テーマ

配列と繰り返し処理、待ち時間のシミュレーション

この問題は、配列に入っている値を使って、来訪者ごとの開始時刻・終了時刻・待ち時間を順に計算する問題です。

配列 Touchaku、Kaishi、Shuryou が出てきますね。

名前を見ると、Touchaku は到着時刻、Kaishi は開始時刻、Shuryou は終了時刻を表していそうです。

はい。変数名から役割を読み取ることも、プログラム問題では大切です。

問2の解説

空欄がたくさんあって、どれから考えればいいのか迷います。

まずは、プログラムの目的を確認しましょう。

このプログラムは、2人目以降について、開始時刻・終了時刻・待ち時間を順番に求めています。

つまり、問1で表を埋めた作業を、プログラムで順番に行うということですね。

まずは、問1で整理した表1をもう一度確認しましょう。

表1では、各来訪者について、 「到着時刻」 「開始時刻」 「終了時刻」 「待ち時間」 を順に求めていました。

問2のプログラムは、この表で行った計算をプログラムで表したものです。最終的に各配列に入る値は、以下のとおりです。

次に、プログラムの01〜05行目を確認します。

ここでは、計算に使う値や配列を最初に準備しています。

01〜05行目で準備しているもの

01行目: taiken に、1人あたりの体験時間である 3分 を入れています。

02行目: Touchaku は到着時刻を入れる配列です。 Touchaku[i] は、i人目の到着時刻を表します。

03行目: kyakusuu には、配列 Touchaku の要素数、つまり来訪者の人数を入れています。

04行目: Kaishi は開始時刻を入れる配列です。 Kaishi[i] は、i人目の開始時刻を表します。

05行目: Shuryou は終了時刻を入れる配列です。 Shuryou[i] は、i人目の終了時刻を表します。

ここで大切なのは、 i が「今注目している来訪者」 を表していることです。

例えば、i = 3 なら3人目、i = 5 なら5人目を表します。

そのため、今の来訪者を i 人目とすると、 直前の人は i − 1 人目 です。

つまり、 Shuryou[i − 1] は、 「直前の人の終了時刻」 を表しています。

確認しよう

i 人目の待ち時間を求めるには、まず i 人目の開始時刻を求める必要があります。

開始時刻は、 本人の到着時刻と 直前の人の終了時刻のうち、遅い方です。

そのため、(08)行目の

Kaishi[i] = 最大値( カ , キ )

には、 本人の到着時刻である Touchaku[i] と、 直前の人の終了時刻である Shuryou[i − 1] が入ります。

したがって、 カ ・ キ は、 ① Shuryou[i − 1] と ② Touchaku[i] です。

なお、問題文に「カ・キの解答の順序は問わない」とあるため、①と②はどちらの順番でも正解です。

最大値を使うのは、「遅い方の時刻」を選ぶためなんですね。

はい。次に、終了時刻を考えましょう。

終了時刻は、開始時刻 + 体験時間で求めます。

Shuryou[i] = ク

i 人目の開始時刻は Kaishi[i]、 体験時間は taiken なので、 終了時刻は Kaishi[i] + taiken です。

よって、 ク は ⑤ Kaishi[i] + taiken です。

ここは問1の「終了時刻=開始時刻+体験時間」と同じですね。

その通りです。最後に、待ち時間を表示する部分を確認しましょう。

待ち時間は、開始時刻 − 到着時刻で求めます。

表示する(i,"人目の待ち時間:", ケ − コ ,"分間")

i 人目の開始時刻は Kaishi[i]、 i 人目の到着時刻は Touchaku[i] です。

したがって、 ケ は ② Kaishi[i]、 コ は ② Touchaku[i] です。

ここで注意したいのは、 ケ と コ の解答群は別々なので、同じ②でも意味が違うことです。

実際にトレースして確認しよう

07行目から10行目のプログラムは、同じ処理を2人目から順番に繰り返しているんですね。

ただ、読むだけだと本当に正しく計算できているか少し不安です。

いいですね。

プログラム問題では、処理を途中で止めるようにして、変数や配列の値を一つずつ確認することが大切です。

画面の表を見るだけではなく、自分で値を書き込んで確認するということですね。

その通りです。

その通りです。まずは、下の表を紙に書き写して、i = 2 から順番に、「?」の値を埋めてみましょう。

i 到着時刻
Touchaku[i]
直前の終了時刻
Shuryou[i−1]
開始時刻
Kaishi[i]
終了時刻
Shuryou[i]
待ち時間
Kaishi[i]−Touchaku[i]
2 3 3 最大値(3, 3) = ? ? + 3 = ? ? − 3 = ?
3 4 ? 最大値(4, ?) = ? ? + 3 = ? ? − 4 = ?
4 10 ? 最大値(10, ?) = ? ? + 3 = ? ? − 10 = ?
5 11 ? 最大値(11, ?) = ? ? + 3 = ? ? − 11 = ?
6 12 ? 最大値(12, ?) = ? ? + 3 = ? ? − 12 = ?

書き写して確認しよう

ポイントは、1行ずつ順番に埋めることです。 たとえば i = 3 の「直前の終了時刻」は、 1つ前の行で求めた Shuryou[2] を使います。

このように、前の行で求めた値を次の行で使うため、 途中の計算を紙に残しておくとミスを減らせます。

では、実際に埋めた結果を確認してみましょう。

i 到着時刻
Touchaku[i]
直前の終了時刻
Shuryou[i−1]
開始時刻
Kaishi[i]
終了時刻
Shuryou[i]
待ち時間
Kaishi[i]−Touchaku[i]
2 3 3 最大値(3, 3) = 3 3 + 3 = 6 3 − 3 = 3
3 4 6 最大値(4, 6) = 6 6 + 3 = 9 6 − 4 = 2
4 10 9 最大値(10, 9) = 10 10 + 3 = 13 10 − 10 = 0
5 11 13 最大値(11, 13) = 13 13 + 3 = 16 13 − 11 = 2
6 12 16 最大値(12, 16) = 16 16 + 3 = 19 16 − 12 = 4

確認しよう

各来訪者について、開始時刻は 最大値(本人の到着時刻,直前の終了時刻) で求めます。

終了時刻は 開始時刻 + 体験時間、 待ち時間は 開始時刻 − 到着時刻 です。

A n s w e r

答えは、カ・キ=①・②(順不同)、ク=⑤、ケ=②、コ=②です。

理由:開始時刻は「本人の到着時刻 Touchaku[i]」と「直前の終了時刻 Shuryou[i−1]」の遅い方なので、 カ・キは①と②です。 終了時刻は Kaishi[i] + taiken なので、クは⑤です。 待ち時間は Kaishi[i] − Touchaku[i] なので、ケは②、コは②です。

間違えやすいポイント

・Touchaku[i] と Touchaku[i−1] を取り違える

・直前の人の終了時刻 Shuryou[i−1] ではなく、自分の終了時刻 Shuryou[i] を使ってしまう

・同じ②でも、解答群が違うと意味が変わることを見落とす

・待ち時間を「終了時刻 − 到着時刻」としてしまう

✏️類題にチャレンジ

ある展示で、来訪者は到着した順番に1人ずつ体験します。 1人あたりの体験時間は4分です。

配列 Touchaku = [0, 2, 9] とし、 1人目の開始時刻を0分、終了時刻を4分とします。

2人目と3人目について、開始時刻・終了時刻・待ち時間を求めましょう。

ヒントをみる

まずは、1人目の情報を表に整理しましょう。 1人目は、開始時刻が0分、終了時刻が4分なので、待ち時間は0分です。

到着時刻 開始時刻 終了時刻 待ち時間
1人目 0 0 4 0
2人目 2 ? ? ?
3人目 9 ? ? ?

開始時刻は、 本人の到着時刻と 直前の人の終了時刻 の遅い方です。

終了時刻は「開始時刻+体験時間」、 待ち時間は「開始時刻−到着時刻」で求めます。


2人目:開始時刻

2人目:終了時刻

2人目:待ち時間

3人目:開始時刻

3人目:終了時刻

3人目:待ち時間

※この再現版では提出は行いません(送信先は未接続です)

Well done!

次のステップに進みましょう!

次のステップに進む

← 前のステップにもどる