2025年 共通テスト情報Ⅰ 第3問 解説|工芸品の担当割当てプログラム(配列の最小値と繰り返し)
正解と配点
| 設問 | 解答記号 | 正解 | 配点 |
|---|---|---|---|
| 問1 | ア | 2 | 1 |
| 問1 | イ | 2 | 1 |
| 問1 | ウ | 2 | 2 |
| 問1 | エ | 3 | 2 |
| 問1 | オ | 5 | 2 |
| 問2 | カ | 4 | 2 |
| 問2 | キ | ① | 3 |
| 問2 | ク | 1 | 2 |
| 問3 | ケ | ① | 2 |
| 問3 | コ | ④ | 2 |
| 問3 | サ | ② | 3 |
| 問3 | シ | ⓪ | 3 |
丸数字(②など)は選択肢の番号です。
第3問は、共通テスト用プログラム表記で書かれたプログラムを読み、空欄を埋める問題です。題材は「工芸品を製作する担当を、部員に順に割り当てる」作業でした。
- 問1: 割当ての規則を理解し、手作業で割り当てる
- 問2: 「最も早く空きになる部員」を配列から探すプログラム
- 問3: 問2の処理を繰り返して、全工芸品の割当て一覧を表示するプログラム
問1で手作業の流れをつかんでおくと、問2・問3のプログラムが「その手作業をそのまま書いたもの」だと分かります。
場面と規則
工芸部では、文化祭に向けた合宿で9個の工芸品を部員3名で分担して作ります。製作日数は工芸品ごとに決まっていて、誰が作っても変わりません。
| 工芸品 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|
| 製作日数 | 4 | 1 | 3 | 1 | 3 | 4 | 2 | 4 | 3 |
- 1つの工芸品は1人の部員が担当し、完成するまで他の工芸品には取り掛からない
- 工芸品の番号順に割り当てる
- 規則: 最も早く空きになる部員(複数いる場合は番号が最小の部員)が、空きになった日から次の工芸品を担当する
「空き」とは、その日に割り当てがないことです。例えば、1日目から4日間作業する部員は、5日目に空きになります。
問1 手作業で割り当てる(ア〜オ)
問題の図では、工芸品4まで割り当てた状態が示されていました。
- 部員1:工芸品1(1〜4日目)
- 部員2:工芸品2(1日目)→ 工芸品4(2日目)
- 部員3:工芸品3(1〜3日目)
正解:ア 2、イ 2(工芸品4は部員2が2日目に製作)/ウ 2、エ 3、オ 5(工芸品5は部員2が3〜5日目)
工芸品4まで割り当てた時点で、空きになる日は部員1が5日目、部員2が3日目、部員3が4日目です。最も早いのは部員2(3日目)なので、工芸品5(3日間)は部員2が3日目〜5日目に担当します。
全9品の割当て
同じ規則で最後まで割り当てると、次のようになります。問題のメール文面の最終行「工芸品9 … 部員1:7日目〜9日目」と一致することを確かめましょう。
| 工芸品 | 日数 | 割当て前の空き日(部員1, 2, 3) | 担当 | 期間 |
|---|---|---|---|---|
| 1 | 4 | 1, 1, 1 | 部員1 | 1〜4日目 |
| 2 | 1 | 5, 1, 1 | 部員2 | 1〜1日目 |
| 3 | 3 | 5, 2, 1 | 部員3 | 1〜3日目 |
| 4 | 1 | 5, 2, 4 | 部員2 | 2〜2日目 |
| 5 | 3 | 5, 3, 4 | 部員2 | 3〜5日目 |
| 6 | 4 | 5, 6, 4 | 部員3 | 4〜7日目 |
| 7 | 2 | 5, 6, 8 | 部員1 | 5〜6日目 |
| 8 | 4 | 7, 6, 8 | 部員2 | 6〜9日目 |
| 9 | 3 | 7, 10, 8 | 部員1 | 7〜9日目 |
工芸品2では、部員2と部員3がどちらも1日目に空きです。規則により番号が小さい部員2が担当します。
問2 最も早く空きになる部員を探す(カ・キ・ク)
配列 Akibi: 各部員が空きになる日を入れた配列です。この問題では添字が1から始まると明記されていて、添字が部員の番号を表します。共通テスト用プログラム表記では、特に説明がなければ添字は0から始まるので、問題文の指定を必ず確認しましょう。
カ:工芸品4まで割り当てたときの Akibi[3]
正解:4
部員3は1〜3日目に工芸品3を作るので、4日目に空きになります。Akibi は [5, 3, 4] です。最小の要素は Akibi[2] = 3 なので、次は部員2が担当します(問1の結果と一致)。
キ:プログラムの条件
プログラムは、部員1を仮の担当(tantou = 1)とし、部員2から最後の部員まで順に比べて、より早く空く部員が見つかったら担当を入れ替えます。配列から最小値の位置を探す、典型的な処理です。
(01) Akibi = [5, 3, 4]
(02) buinsu = 3
(03) tantou = 1
(04) buin を 2 から buinsu まで 1 ずつ増やしながら繰り返す:
(05) | もし Akibi[buin] < Akibi[tantou] ならば:
(06) ⎿ ⎿ tantou = buin
(07) 表示する("次の工芸品の担当は部員", tantou, "です。")
正解:① Akibi[buin] < Akibi[tantou]
- 比べるのは部員の番号(buin と tantou)ではなく、空きになる日(Akibi[buin] と Akibi[tantou])です。番号どうしを比べる⓪・②は誤りです。
- 「より早く空く」部員を探すので、小さい方に入れ替えます。③の「>」では最も遅く空く部員になってしまいます。
- 「<」なので、空き日が同じときは入れ替えません。先に調べた(番号が小さい)部員が担当のまま残るので、「複数いる場合は最小の番号の部員」という規則にも合っています。「<=」にすると、同じ日のときに大きい番号の部員に入れ替わってしまいます。
ク:部員が5名のときに (06) 行目が実行される回数
条件: Akibi = [5, 6, 4, 4, 4]、buinsu = 5 で実行します。
正解:1回(「次の工芸品の担当は部員3です。」と表示される)
| buin | 比べる値 | 条件 | tantou |
|---|---|---|---|
| (開始) | — | — | 1 |
| 2 | 6 < 5(Akibi[1]) | 成り立たない | 1 |
| 3 | 4 < 5(Akibi[1]) | 成り立つ → (06) 実行 | 3 |
| 4 | 4 < 4(Akibi[3]) | 成り立たない | 3 |
| 5 | 4 < 4(Akibi[3]) | 成り立たない | 3 |
部員3・4・5はどれも4日目に空きですが、「<」なので最初に見つかった部員3のまま変わりません。代入は1回だけです。
問3 全工芸品の割当て一覧を表示する(ケ・コ・サ・シ)
使う変数: 製作日数を工芸品の番号順に並べた配列 Nissu(添字は1から)、工芸品の数 kougeihinsu = 9、空き日を管理する配列 Akibi、部員数 buinsu = 3 です。最初はどの部員も1日目に空きなので、Akibi = [1, 1, 1] から始めます。(06)〜(09) 行目は問2のプログラムと同じ「担当を決める処理」です。
(01) Nissu = [4, 1, 3, 1, 3, 4, 2, 4, 3]
(02) kougeihinsu = 9
(03) Akibi = [1, 1, 1]
(04) buinsu = 3
(05) kougeihin を 1 から kougeihinsu まで 1 ずつ増やしながら繰り返す:
(06) | tantou = 1
(07) | buin を 2 から buinsu まで 1 ずつ増やしながら繰り返す:
(08) | | もし Akibi[buin] < Akibi[tantou] ならば:
(09) | ⎿ ⎿ tantou = buin
(10) | 表示する("工芸品", kougeihin, " … ", "部員", tantou, ":",
| Akibi[tantou], "日目~",
| Akibi[tantou] + Nissu[kougeihin] - 1, "日目")
(11) ⎿ Akibi[tantou] = Akibi[tantou] + Nissu[kougeihin]
正解:ケ ① kougeihin/コ ④ kougeihinsu/サ ② Nissu[kougeihin] − 1/シ ⓪ Nissu[kougeihin]
ケ・コ:外側の繰り返し
工芸品1から工芸品9まで、1つずつ担当を決めるので、kougeihin を 1 から kougeihinsu まで繰り返します。(10) 行目の表示で kougeihin を使っていることもヒントになります。buinsu(部員数)まで繰り返すと、3個しか割り当てられません。
サ:終了日の計算
開始日は担当部員が空きになる日、Akibi[tantou] です。製作日数が n 日なら、終了日は開始日 + n − 1 です。例えば工芸品1は 1 + 4 − 1 = 4日目に終わります。ここで使う日数は、いま割り当てている工芸品の日数なので Nissu[kougeihin] です。Nissu[tantou] は「部員の番号番目の工芸品の日数」になってしまい、意味が合いません。
「− 1」を忘れて Nissu[kougeihin] にすると、工芸品1が「1日目〜5日目」と表示されてしまいます。
シ:空き日の更新
担当部員が次に空きになるのは、終了日の翌日、つまり開始日 + n です。工芸品1なら 1 + 4 = 5日目で、問題の「部員1は5日目に空き」と一致します。
実行の流れ
プログラムが実行されると、ループ1回ごとに Akibi は次のように変わります。上の「全9品の割当て」の表と同じ結果になります。
| kougeihin | Nissu[kougeihin] | tantou | 表示される期間 | 更新後の Akibi |
|---|---|---|---|---|
| 1 | 4 | 1 | 1〜4日目 | [5, 1, 1] |
| 2 | 1 | 2 | 1〜1日目 | [5, 2, 1] |
| 3 | 3 | 3 | 1〜3日目 | [5, 2, 4] |
| 4 | 1 | 2 | 2〜2日目 | [5, 3, 4] |
| 5 | 3 | 2 | 3〜5日目 | [5, 6, 4] |
| 6 | 4 | 3 | 4〜7日目 | [5, 6, 8] |
| 7 | 2 | 1 | 5〜6日目 | [7, 6, 8] |
| 8 | 4 | 2 | 6〜9日目 | [7, 10, 8] |
| 9 | 3 | 1 | 7〜9日目 | [10, 10, 8] |
第3問のまとめ
- 問1の手作業がそのまま問2・問3のプログラムになっています。まず手で解いてからプログラムを読むと、空欄の意味がはっきりします。
- 「最小値の位置を探す」処理(仮の答えを置いて、より小さいものが見つかったら入れ替える)は頻出です。「<」と「<=」の違いが、同じ値のときにどちらを選ぶかを決めます。
- 開始日と終了日の「+ n − 1」と「+ n」の違いは、具体的な数字を入れて確かめると間違えません。
- 添字が0から始まるか1から始まるかは、問題文の指定を必ず確認しましょう。表記の基本は「共通テスト用プログラム表記の読み方」で解説しています。