見出し画像

【情報 共通テスト】プログラミング対策講座~情報関係基礎 2019年(平成31年)第3問 擬似言語プログラミング グループ分け論理【高校情報Ⅰ授業】

情報関係基礎 2019年(平成31年)第3問


【資料ダウンロード】

PDFの他、パワーポイント、学習指導案 等の原本も無料提供しています。

情報教育の底上げが目的なので、資料を修正して、学校・塾(営利目的含む)の授業等で利用して頂いて問題ありません。私への連絡不要ですが、利用する際には、YouTubeチャンネル・情報Ⅰ動画教科書・IT用語動画辞典を紹介してもらえると嬉しいです。

■独自解説パワーポイント
https://toppakou.com/info1/download/98_大学入学共通テスト/03_H31_2019/情報大学入学共通テスト対策【情報関係基礎_平成31年(2019年)大問3】.pptx

■問題
大学入試センター 情報関係基礎過去問ダウンロード(情報処理学会 情報入試委員会)
https://drive.google.com/drive/folders/140pQJOKWzYH2-NvzPCyQdqFPHcZhCSOa


【文字おこし】

大学入学共通テスト「情報」対策講座
情報関係基礎 平成31年(2019年) 大問3のグループ分けの擬似言語をつかったプログラミング問題の解説をしていきます。


美香さんのクラスでは、春夏秋冬の4つのグループに分かれて季節ごとの花について調査することになったとあります。
そのグループ分けの方法についての問題になります。

この年度の情報関係基礎の平均点は49点と非常に低い点数になっています。
すべての大問合わせての平均点ですが、今から説明するこの問題の難易度がかなり高く時間内で解くのが困難なのが原因だと思います。
個人的な感想ですが、現役の優秀なプログラマでも20分でこの擬似言語を理解し解き終える人は少数だと思います。
2025年から実施予定の情報の共通テストでは、初回この難易度にしてしまうと流石に批判が出ると思うので、想定難易度は、すでに別動画で解説している令和2年や3年くらいのものになると思います。
ただ、トレース能力を鍛えるという意味では良い問題なので、時間は気にせずに実際に数値を当てはめて紙上でトレースしてみることをお勧めします。

得点できなかった方も自信を落とさないでください。

それでは順を追って解説をしていきます。

春夏秋冬のグループ分けはくじ引きによって決定した順位である「くじ順」と生徒の希望にもとづいて行われます。

各グループの生徒数が出来るだけ均等になるように振り分けるために、クラスの生徒数が4の倍数でない場合には、生徒数を4で割った余りと同じ数のグループに生徒を1名多く振り分けます。

どのグループに振り分けるかは2つの方法がありますが、一旦ここまでで、空欄ア、イを見ていきましょう。
クラスの人数が10名の場合は、空欄ア 名のグループと 空欄イ 名のグループのグループが出来るとあります。

クラスの生徒数が4の倍数でない場合には、生徒数を4で割った余りと同じ数のグループに生徒を1名多く振り分けるとあるので
まずは、10名を4で割って 商は2 余りは2となります。
均等にするとまずは2名ずつふりわけることになります。そして、あまりの2名分を1名ずつふりわけると、
この絵のように2名のグループと3名のグループができます。
よって、空欄ア、イは順不同で2と3が入ります。

余り分をどのグループに割り振るかのには、方法1と方法2の二つの方法があり、それぞれについてシミュレーションする能力が求められています。

方法1は くじ順に生徒の希望に沿った振り分けを行い、1名多いグループが先に決まるようにする方法

方法2は 第1希望の人数の多いグループに1名多く振り分ける。ただし、同数の場合には、春、夏、秋、冬の順に多いグループを決める方法となります。

表1はくじ順に並んだ生徒の10名の名簿になります。
Aさんの第一希望は春、第二希望は秋、第3希望は夏、第4希望は冬となります。
くじの順位はAさんBさんCさんの順になっていますのでその優先順で、グループが割り振られていきます。

この表を見るとき、皆の第一希望の行を横に順番に見てしまうとアウトです。
この解釈でやってしまうと、問2の擬似言語の論理と合わなくなります。
くじ順の順番に見ていく必要があります。
ここの解釈誤りで得点を落とした方もいるのではないかと個人的に予想しています。

まず、方法1で見ていきましょう。
初期状態としては春、夏、秋、冬ともに0人とします。

くじの順位一位のAさんは希望通り春に決定です。春のカウントを1プラスしておきます。
Bさんも秋に決定です。秋のカウントを1プラスします。
Cさんは春の2人目なので決定します。春のカウントを2にします。
Dさんは春の3人目ですが、方法1はくじ順に沿って1名多いグループにできるので、Dさんも春に決定します。春に関しては上限の3人に達しました。
Eさんも春ですが、すでに上限値なので次の第二希望の判定で、夏にきまります。夏のカウントを1にしておきます。
Fさんは第一希望の夏はEさんに続き2人目なので夏に決定です。夏のカウントを2にします。

Gさんは第一希望の春は既に上限値なので次の第二希望の夏の判定になります。
夏は3人目ですが、方法1はくじ順に従って1名多いグループに出来るので春に続き3人枠にできます。よってGさんは夏に決定します。
Hさんの第一希望の秋は2人目なので秋に決定です。秋のカウントを2にします。すでに3人枠は2つ使っているので、ここで秋は上限値に達します。
Iさんは春、秋は上限に達しているので、第三希望の冬になります。 冬のカウントを1にします。
Jさんは春、夏、秋共に上限に達しているので第4希望の冬になります。 冬のカウントを2にします。


この結果をもとに空欄部分を埋めていきましょう。
空欄ウは第一希望通りに割り振られた連続した範囲なのでAからDになります。
よって空欄ウは選択肢③のDになります。

空欄エは第3希望になる人で、Iさんだけ該当するので選択肢⑧のIになります。

そして空欄オのJさんは第4希望のグループに割り振られていることが結果表より分かります。

――――
方法2は 第1希望の人数の多いグループに1名多く振り分ける。ただし、同数の場合には、春、夏、秋、冬の多いグループを決める方法となります。

今回の第一希望を見ると
春が7人、夏が1人、秋が2人、冬が0人で
同数の物はなく、春が1番、秋が2番なので、春と秋の人数は3人が上限ということになります。
一方、夏と冬は2人が上限となります。
この人数を前提として、第一希望から順にみていきましょう。
Aさんは春に決定で、春のカウントを1にします。
Bさんも秋に決定で、秋のカウントを1にします。
Cさんは春に決定で、春のカウントを2にします。
Dさんも春ですが、はじめに決めた上限の3には達していないので、春に決定します。
春のカウントを3にしてDさんで上限に達します。

Eさんは春ですが上限に達しているので、第二希望の判定で夏に決定します。夏のカウントを1にします。
Fさんは夏に決定で、夏のカウントを2にします。
Gさんは春ですが上限に達しているので、第二希望の夏も方法2では上限に達しているので、第3希望の秋になります。秋のカウントを2にします。

Hさんの第一希望は秋ですが、上限の3に達していないので秋に決定します。
これで秋は上限値に達します。

Iさんは、春、秋共に上限に達しているので第3希望の冬に決定します。冬のカウントを1とします。
Jさんは第4希望の冬となり、冬のカウントを2とします。
これですべてのグループの割り当てが決まります。

では、空欄部分を見ていきましょう。
方法2の場合1名多く振り分けるグループは、第一希望の多い順なのではじめに説明したように春と秋なので選択肢としては、0と2になります。

空欄クの方法1と方法2で異なるグループになる人は、二つの判定結果の表を比較すると、Gさんが方法1では夏ですが、方法2では秋となっているので、Gさんで選択肢としては⑥となります。

――― 

つぎは方法1について、擬似言語を使った問題を解いて行きましょう。
図1 方法1にもとづく振り分け手続きの図になります。

はじめに使われている変数の概要について説明します。
まず、春、夏、秋、冬はそれぞれのグループ番号が割り振られています。
春は1、夏は2、秋は3、冬は4になります。
そして、表1の様な名簿を配列として準備します。

配列Namaeはくじの順位順に生徒の名前が格納されたものになります。
ここでは、Aさん、Bさんのように表1と同様に格納します。

2次元配列kibo(希望)はクジの順位と、希望順位を添字として希望するグループ番号が格納されています。

表1のこの部分が対応しています。
変数ninzuは生徒全員の人数を格納した変数で、今回は10人でシミュレーションするので10を格納します。

配列Gninzuは、春夏秋冬のグループ番号が添字となり、それぞれのグループに振り分けられた生徒の人数を格納します。

二次元配列Huriwakeは グループ番号とそのグループに振り分けた順番を添え字として、そのグループに振り分けられた生徒の名前を格納します。

変数gは振り分ける人数の上限に達したグループ数を格納します。

変数teiinnは、変数gの値に基づいてグループの上限値を格納します。

他にも変数がありますが、実際に処理を追いながら説明していきます。

処理が長いので20行目までの繰り返し処理までを説明します。


1行目について、syo ← ninzu ÷ 4は 変数ninzuの値を4で割った商を変数syoに代入しています。
ninzu は10なので 10÷4 の商である 2が変数syoに代入されます。

amari ←ninzu % 4 は ninzuを4で割ったときの余りを変数amariに代入しています。
つまり10÷4の余りで2をamariに代入します。

そして変数gに初期値の0を代入します。

2行目は20行目までの繰り返し処理になります。
iを1からninzuまで1ずつ増やしながらとあるので、10回繰り返すことになります。

3行目は 変数syoの値を変数teiin に代入しています。 商は2なのでteiinも2になります。

そして4行目は条件文で 5行目でteiinの値に+1する処理、つまり定員を2名から3名にする処理の実行条件になります。
定員に達したグループ数を表す変数gが、定員を3名に増やせるグループ数である変数amariより小さければ 定員を3名まで増やすことができるので
選択肢としては③のg < amari となります。

今回はgは0、amariは2なので Trueとなり
teiinは3に更新されます。

7行目は変数owariに0を代入しています。13行目はowariを1に更新する処理になりますが、ループの継続条件になります。

そして、変数jに1を代入しています。

9行目は、二次元配列Kiboの値を取り出し変数kohoに格納しています。
今回はiとjともに1なので kibo配列の1行1列目が該当し1 つまり春のグループ番号がkohoに格納されます。
10行目は17行目までの実行条件になりますが、二次元配列Huriwakeを更新していることから、そのグループに決定した時に呼ばれていると想定できます。

グループに入れる条件は、まだ定員に達していないことになります。
今のグループの人数と定員を比較すれば判定が可能になります。
今のグループの人数が分かるのは Gninzu配列なので
空欄コは選択肢aのGninzu[g] になります。

今回はkoho変数は1の春で Gninzuの配列1番目はまだ0なので、Trueとなります。

11行目は Gninzu[koho]は0なのでプラス1した値を変数Xに格納し、
そのxの値を同じ場所に上書きします。今回は春の人数が1となります。

12行目は配列変数Huriwakeの更新処理で 今回は1行1列目に A さんの名前が格納されます。

13行目はowariを0から1に更新します。

14行目は判定で15行目を見ると変数gの上限に達したグループ数を1プラスしています。
つまり14行目は定員の2名に達したかを判定していますので、現在のグループ人数と比較する必要があります。
今回の確定者も含めたグループの人数はGninzuに入っているので、空欄サはaのGninzu[g] になります。
今回はGninzuの添字1 1 でteiinは3なのでFALSEとなり、処理には入りません。

18行目で変数jを1プラスしています。Jは希望二次元配列でつかわれているので、次の希望の判定の準備になります。

空欄シは、生徒毎のループを抜ける条件で、今回のAさんは確定したので、この子ループは抜けて、2行目からの次の生徒の判定にはいります。
子ループを続けるのは、確定したか否かなので、確定時に13行目で更新しているowari変数を使います。
つまり、空欄シはowari=1になるまで実行するということになります。
※今回は終了条件ですが、問題によっては継続条件を書く場合があります、その場合はowari=0にする必要があります。

これをBさんCさんと10人分行うと
Huriwake配列はこのように更新されます。

――
それの表示処理が21行目以降になります。

21行目でループの継続条件があり26行目までを繰り返します。
外側のループは春、夏、秋、冬のグループ毎
内側のループはそのグループに属する生徒数分繰り返します。
iは1から4までカウントアップしますが、Huriwakeの配列の表示でも使われています。
実際の値を当てはめて処理を追っていきます。
21行目でi=1として
22行目で「グループ1のメンバー:」と表示します。
23行目はjを1から 空欄スまで増やしながらとありますが、 jはグループに属する生徒名の表示に使っているので、グループ人数分繰り返す必要があります。
よって選択肢⑧のGninzu[i]になります。
一番初めのループはiもjも1なのでAが表示されます。


春グループに属するメンバ数分 子ループを回し 
出力結果のイメージのようにACDと順番に表示されます。

子ループを抜けて次はグループ2 つまり夏のメンバを表示します。
グループ3、4も同様に繰り返されループの処理を抜けます。

―――――――――――――


次に問3 図2の 方法2に基づく振り分けの手続きについて解説していきます。

本文にもある通り、2行目から16行目は、各グループに振り分けられる人数を先に求めて、17行目~28行目の処理でその人数に基づく振り分けを行っています。

まず16行目までの処理を、値を当てはめながら説明していきます。

1行目は先ほどの方法1と同じくsyoには2 amariには2が代入されます。

2行目から4行目は繰り返し処理で1からninzuuまで1ずつ増やしながらなので10回繰り返されます。

Kibo配列の二番目の1は固定なので、各生徒の第一希望のグループを抽出していることが分かります。

第一希望の春、夏、秋、冬のそれぞれの人数をKibosu 配列に格納しています。
Kibosu配列は初めは全て0で初期化されています。変数gが希望グループのことになるので、Kibosu[g]の場所をプラス1します。選択肢では⑤になります。
人数分繰り返すと添字1の春は7 添字2の夏は1 添字3の秋は2 添字4の冬は0のままとなります。

―――

5行目から6行目は グループ毎の定員を示すGteiin配列に変数syoの値 つまり2を代入しています。

8行目から16行目はループ処理で 1から変数amari までとあるので、2回ループすることになります。
9行目で変数sにー1を代入しています。

空欄ソ、タ、チについては先に解答の方を表示させておきます。
この部分はかなり難易度が高く、空欄が無くても何をやっているのかがわかりにくいため、トレースイメージで流れを説明していきます。

まずはi=1のループで9行目でSにー1が代入されます。
jを1から4まで1ずつ増やしながら11行目から14行目の繰り替えし処理を行います。
kibosuの添字1は7で-1<7はTrue Gteiinの添え字1は2で変数syoの値も2なので
Trueになり12行目の処理が行われます。
Kibosu添字1の値である春の希望者数7を変数sに代入します
そして変数gにjの値である1を代入します。

つぎはjを2にします。
sが先ほど設定した7で kibosu添字2の夏の希望者は1なので、条件に当てはまらず、次のjを3にしたループに行きます。
sは先ほど設定した7のままで kibosu添字3の秋の希望者は2なので、条件に当てはまらず、次のjを4にしたループに行きます。
sは先ほど設定した7のままで kibosu添字4の冬の希望者は0なので、条件に当てはまらず、ここでjが4に達している為 15行目の処理が行われます
gは春のグループ番号の1が入っているので、配列Gteiinの添字1の値をプラス1して3にします。
つまり、gには定員が2のものの中で希望者が最も多いグループ番号が入っている

8行目の親ループに戻ってiを2にします。
sにー1を設定します。

jが1の子ループを行っていきます。
11行目は-1<7で初めの条件は満たしますが、Gteiin添字1は3になっているのでFalseになり条件を満たしません
jが2の場合のループに入ります。
kibosu添字2は1なので-1<1 を充たします。 2つ目の2=2の条件を満たすので
12行目の処理が行われます。
変数sに、kibosu添字2の1が代入されます。 gに2が代入されます。

jが3の場合のループに入ります。
kibosu添字3は2なので1<2 を充たします。 2つ目の2=2の条件を満たすので
12行目の処理が行われます。
変数sに、kibosu添字3の2が代入されます。 gに3が代入されます。

jが4のループは2<0で条件に当てはまりません。
子ループをおえて15行目の処理でgには3が入っているので秋グループのグループ定員数をプラス1して3にします。

―――

では17行目からの処理も実際に数値を当てはめながらトレースしていきます。

iを1から人数分繰り返します。
初回ループなのでiは1になります
19行目から27行目は、同一生徒の希望を順番に判定していきます。

20行目はkibo配列の添字1,1は春のグループ番号の1になりますのでそれを変数kohoに代入します。
Gninzu添字1は0で、Gteiin添字1は2なので判定はTrueになり
22行目の処理に入ります。この時点で希望に合致したことになります。
Gninzuの添字1の値である0に1をプラスした1を変数xに代入します。
Gninzuの添字1つまり春グループの人数を1にします。

23行目は、Namae配列の添字1のAさんの名前を二次元配列:Huriwakeの添字1,1 つまり春の1番目に代入します。

24行目は子ループを抜けるため owari変数に1を代入します。
26行目は次の希望の判定のためにjを+1しておきますが、今回は27行目でowariが1なのでループを抜け次のBさんの判定に入ります。

最終的なHurikae配列はこのような形になります。

空欄ツテは20行目の総実行回数を問われています。
順番にトレースする必要はなく、判定回数と一致するので、問題1で行った、〇と✖の合計値のことになります。つまり18回になります。

以上で解説は終了します。
かなり難易度が高く感じたと思いますが、時間内で解くのは難しいので、時間を気にせずにこの問題でトレース力を養いましょう。

今回の解説は以上になります。最後までご視聴ありがとうございました。


【参考サイト・参考文献】

大学入試センター 情報関係基礎過去問ダウンロード(情報処理学会 情報入試委員会)
https://drive.google.com/drive/folders/140pQJOKWzYH2-NvzPCyQdqFPHcZhCSOa

tkmium note 難関進学校の情報科教諭が作成
【解説】 情報関係基礎 平成31年度 センター試験 2019 | tkmium-note
https://tkmium.tech/jouhoukankei-h31/

E.V.ジュニア note 難関進学校の数学科・情報科教諭が作成
マガジン「プログラミング教育」総目次|E.V.ジュニア|note
https://note.com/evjunior/n/ne5610edd5f37


【YouTubeチャンネル】
https://www.youtube.com/channel/UC_0LOFMRg60xDBfkzMAmkfA

【IT用語動画辞典】
https://toppakou.com/ITWORD/

【解説重要用語】
擬似言語、変数、配列

★私の目標
「とある男が授業をしてみた」 の葉一さん
https://www.youtube.com/user/toaruotokohaichi
※Google社に招待頂いた、「YouTube教育クリエイターサミット2020」で
 葉一さんと文部科学省・Google役員の対談セッションに感銘を受けて、高校情報講座スタートしています。


#情報関係基礎 #大学入学共通テスト #大学入試センター



この記事が気に入ったらサポートをしてみませんか?