見出し画像

共通テスト 情報(国立大学入試必須)過去問解説 難易度:やや難 情報関係基礎 2022年プログラミング問題(第3問)

共通テスト 情報関係基礎 2022年プログラミング問題【動画解説】


情報Ⅰ共通テスト対策 書籍出版します!


解説資料ダウンロード

画像1

https://toppakou.com/info1/download/98_大学入学共通テスト/05_R04/情報大学入学共通テスト対策【情報関係基礎_令和4年大問3】.pptx

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

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

文字おこし

※アニメーションの一部を貼りつけているので、詳細は動画でご覧ください。

大学入学共通テスト 情報 対策講座
2022年 令和4年 情報関係基礎 大問3 あみだくじのプログラミング問題の解説をしていきます。

画像3

プログラミング問題は自分自身で解きながら悩むことで力がついていきます。
逆に、解説だけを見て理解したつもりではいつまでたっても力はついてきません。
この解説動画を見る前に必ず自分なりの答えを出してから動画を見てください。

今回、はじめて関数の中身を定義する問題が出題されています。
2025年から実施予定の情報の共通テストを意識したものと考えています。
読解が難しい部分があり、ペース配分を考えて20分で解き終えるには、やや難易度が高い問題だと考えています。
問題自体は、読解力、トレース力、思考力総合的に試されているので良い問題です。
――――
それでは解説を始めていきます。

画像2

Kさんは、あみだくじを表示するプログラムを作ろうと考えています。

画像4

どの文字も同じ幅で表示されることを仮定して、
記号の縦棒、縦と右横棒を組み合わせたもの、縦と左横棒を組み合わせたもの と 改行を組み合わせてあみだくじを作成します。
例えば、この図1のような縦線が3本 横線が4本であるあみだくじの例で考えていきます。
1行1列目は縦棒、1行2列目は縦右横棒、1行3列目は縦左横棒 で2行目を表示するために、改行します。
2行1列目は縦右横棒、2行2列目は縦左横棒、2行3列目は縦棒 で3行目を表示するために改行します。
同様の手順で4行目まで表示します。

横棒同士をつなげるためには、縦右横棒の次は必ず縦左横棒が来ます。
また、プログラムを簡単にするために、1つの行にはちょうど1本だけ横線があるとしています。

問1 あみだくじを表示するプログラムの作成

画像5
画像6
画像7

それでは、問1から解説をしていきます。
問1はあみだくじを表示するプログラムの作成になります。
まず、変数の説明からです。

画像8

まず、変数tateは縦線の本数を代入します。
変数yokoは横線の本数になります。

配列Yokosenは横線の位置情報を整数で代入します。

本文の表現で、
『配列の要素Yokosen[y]がxであることは、上からy番目の横線が左からx番目の縦線とx+1番目の縦線を結ぶことを表す』
とありますが、この部分が変数の文字だらけで意味が分からなくてつまづく方も多いと思います。

図1のあみだくじを例に具体的な数値を当てはめて説明していきます。

まず、変数tateは縦棒の本数なので、図1では全部で3本縦線がありますので、3が代入されます。
変数yokoは横線の本数で、図1では全部で4本あるので、4が代入されます。


配列Yokosenについて、1行に1つだけ横線があるという条件があるので、
配列の要素番号が行番号と一致します。
Yokosen[1]は1行目という意味なります。
例えば、1行目の場合、2番目に縦右横棒の記号があるので、Yokosen[1]には2が代入されます。
縦右横棒のとなりは、必ず縦左横棒の記号になるので、はじめの縦右横棒の位置を定義しておけば、その右隣、つまり列番号+1した位置が対応する横線の位置となります。

先ほどの本文の表現にこの1行2列目の場合の具体的な値を当てはめると、

『配列の要素Yokosen[1]が2であることは、上から1番目(つまり1行目)の横線が左から2番目の縦線と2+1番目(右隣り)の縦線を結ぶことを表す』ということになります。

2行目の始めの横線は1列目にあるので、Yokosen[2]に1を代入します。
3行目の始めの横線は2列目にあるので、Yokosen[3]に2を代入します。
4行目の始めの横線は1列目にあるので、Yokosen[4]に1を代入します。

今説明した内容が空欄ア、イ、ウと一致しますので、穴埋めして読んでいきます。

―――

画像9


この内容を あみだくじを表示する手続きとして示したのが図2になります。
図1のあみだくじの例で、変数に値を入れながら処理を追っていきます。

1行目は繰り返し処理で14行目の最終行までかかっています。
yを1からyokoまで1ずつ増やしながら、yokoは横線の本数で今回は4が代入されています。横棒は各行に1つという条件があるので、yが1の時は1行目の処理、yが2の時は2行目の処理という意味になります。
初回なのでyに1が代入されます。
2行目でxに1が代入されます。
3行目は繰り返し条件で12行目までかかっています。
変数tateは縦線の本数なので今回は3が代入されます。
つまり1列目から3列目までの繰り返し処理になります。

4行目は条件判定で、真の場合に実行される5行目6行目を見ると横線の表示処理だということが分かります。
つまり、横線を引く条件が空欄エということになります。
横線の位置は先ほど説明したようにYokosenに格納されています。
1行目の場合は Yokosen[1]に格納されています。
今判定している列番号とYokosen配列に格納されている列番号が一致すれば横線を引くことになります。
これを変数で表すと、今プログラムで判定している行番号は変数yが対応しているので、Yokosen[y]で、判定している行に対する横線の位置を取り出すことができます。
今判定している列の位置は変数xに格納されているので それと一致すれば横線を引くことができます。
よって、空欄エは④のYokosen[y]=xになります。

初回についてYokosen[1]は2で xは1 なので False 偽 で9行目の処理に入ります。
縦線を改行無しで表示します。
x+1で、xに2が代入されます。
3行目に戻って、xは2 tateは3なので xはtate以下なのでループを継続します。

4行目の判定でYokosen[1]は2で xは2で一致するのでTrueとなり5行目6行目の横線表示処理で横線を表示します。
空欄オは 縦の判定位置をずらす処理になります。10行目ではxに+1しましたが、今回は6行目で次の列の表示処理はすでに行っているので、1つ飛ばす必要があります。
 今いる位置xに+2する必要があります。
よって空欄オの答えは②のx←x+2になります。

処理を続けていきます。
 2+2でxに4が代入されます
3行目にもどり、xは4 tateは3なので ループの継続条件に当てはまらないので13行目の改行表示に移ります。
親ループの1行目に戻りyを1増やして2にして2行目の処理に入ります。

2行目でxに1が代入されます。


1は3以下なので 4行目の処理に入ります。
Yokosen配列の2番目は1が格納されている、つまり2行目の横線の位置は1列めなので、今判定しているxの値と一致し5行目6行目の横線表示処理が行われます。
xをプラス2して3がxに代入されます。
3行目のループの継続条件は3は3以下でTrueなので4行目の判定に入ります。
Yokosen配列の横線の位置と今いる列の位置は一致しないので、9行目の縦線の表示処理を行います。
10行目でxに+1してxが4になります。
3行目に戻ってループの継続条件を満たさないので13行目で改行を行い次の行の判定に移ります。
3行目4行目も同じ要領で実施すると、出力結果にあるあみだくじが表示されます。

過去問題ベースなら、あみだくじを二次元配列に入れるのが王道だと思いますが、
今回は一次元配列で横線の位置を持つという方式でした。
自分ならこのようにしないと思う人も多いと思いますが、
人の書いたプログラムを素直に素早く紐解く能力が求められていますので、
こういう方法もあるんだという考えのもと問題を解いて行きましょう。

――――

問2 あみだくじを引いた結果を求めるプログラム

画像10
画像11
画像12
画像13


次に問2の解説をしていきます。

画像14


問2は問1で作成したあみだくじを引いた結果を求めるプログラムになります。
まず、あみだくじの縦線のそれぞれの上端にコマを置きます。
コマを区別するため、それぞれのコマに番号を付けておきます。
全てのコマを同時に縦線に沿って下に移動していきます。
横線に当たったら、横線をつなぐ2つの縦線の上にあるコマを入れ替えます。

まず、2と3のコマを入れ替えます。
つぎに1と3のコマを入れ替えます。
次に1と2のコマを入れ替えます。
そして3と2のコマを入れ替えます。

この例では最終的に並びは2、3、1となります。

――

画像15


追加になる変数の説明をしていきます。
コマの番号を順番に格納した配列Komaが追加になります。
Komaには最初、あみだくじの上端に置くコマの番号が左から順に格納されます。
今回の場合は123の順で格納されます。
これより、配列Komaの要素数とあみだくじの縦線の本数は等しいことが言えます。
プログラム実行後は231の順で格納されます。

関数も追加になっていますが、実際に擬似言語プログラムを追いながら説明していきます。

プログラムの実行結果は、図4のようにはじめにコマの番号を表示 
つぎにあみだくじを表示、最後にあみだくじの結果としてのコマの番号が表示されます。

画像16


数値を当てはめながら実際にプログラムを追っていきます。
図5はあみだくじの結果を求める手続きになります。
1行目は 配列を表示するの関数を呼び出しています。引数にはKoma配列を受け渡しています。

配列を表示するの関数は 図6になります。

2行目jを1から要素数(Koma)まで1ずつ増やしながら4行目までの処理を繰り返します。
要素数関数は受け渡された配列の要素数を返却する関数なので、今回配列Komaの要素数は3なので 1から3まで3回ループすることになります。

3行目は表示処理で、Koma配列に格納されたコマの番号を表示します。
jに格納されている値が、要素番号の指定に使えるので、空欄ケは ⑦のKoma[j]が入ります。

ループを3回繰り返したあとの出力結果は、配列の中身の123が表示され、改行します。

――

画像17


配列を表示するの処理が終わったので
図5の2行目の あみだくじを表示するの関数を実行します。

呼び出し先のあみだくじを表示するの関数は図7が該当します。

引数が3つあって、第一引数が空欄カになっています。

呼び出し先の図7を見ると、第一引数はtateという変数になります。
先ほどの問1より、縦線の数になりますが、縦線自体を表す変数については選択肢にありません。
本文を読むと配列Komaの要素数とあみだくじの縦線の本数は等しいとあるので、
配列Komaの要素数を縦線の本数として受け渡せばよいということが分かります。

よって空欄カは、選択肢⑤の要素数(Koma)になります。

あみだくじの表示処理については、先ほどの問1で説明済なので割愛します。
この図7の関数の処理内でこのようにあみだくじが表示されます。


――――――――
次に図5の3行目の処理に入ります。

画像18


横線があったら隣り合うコマの配列の順序を入れ替える処理になります。

空欄キ、クがありますが、先に正解の方を表示させておきます。
実際に数値を当てはめて、動きを確認していきます。

3行目はyを1から要素数(Yokosen)まで1ずつ増やしながらとあるので 配列Yokosenの要素数は4なので 1から4まで4回繰り返します。

4行目は 横線の左側に存在するコマの番号を取得し変数tに代入しています。
yが1つまりYokosen[1]は1行目の横線の位置を返却するので2が取得できます。
Koma[2]となり、取得できるコマ番号は2となり、それをtに代入します。
つまり変数tには横線の左側にいるコマの番号が格納されます。

先ほどの例で言うと、右隣りにある3のコマと入れ替えます。

Yokosen[y]+1では今回は2+1で3になります。その位置にあるコマの番号を取り出すため、Koma[Yokosen[y]+1] はKoma[3]となり、コマ番号の3が取り出されます。
それを、左のコマの位置に移動するため
Koma[Yokosen[y]]に上書きします。
左側にあったコマ番号は変数tに入っているので
右側のコマがあった位置に上書きするため
Koma[Yokosen[y]+1]←tとしています。
実際の数値を当てはめると
Koma[3]←2 なのでKoma配列の3番目にコマ番号の2が代入されます。
これで一番目の横線上にあるコマ番号2と3が入れ替わりました。

画像19

今度はyを2にしてループを継続します。2行目のコマ番号1と3の入れ替え処理になります。
4行目で、Yokosen配列の2番目は1なので、横線の左側に存在するコマ番号1を変数tに代入します。入れ替えの為の一時退避になります。

5行目の処理でコマ番号3のコマを左側に移動します。
つまり左側のコマがあるKoma配列の要素番号1にコマ番号3を上書きます。

6行目の処理で一時退避した、もともと左側にあったコマ番号1番を、もともとコマ番号3があったKoma配列の要素番号2に上書きします。

3番目の横線、4番目の横線も同じ要領で入れ替え処理を行い
最後にKoma配列の中身を表示すると
231が表示されます。

――――

問3 並べ替えあみだくじプログラミング

画像20
画像21
画像22
画像23

続いて問3の解説をしていきます。

画像24
画像25


問3は配列Komaの隣り合う要素の大小関係が逆転している時に、昇順に並べ替えるあみだくじの処理になります。
前提として配列Yokosenは十分な大きさを持ち0で初期化されています。
すでにプログラムは完成していて、配列Komaの値が5,2,4,3,1が与えられた場合のシミュレーション力・トレース力を問われています。

実際に数値を当てはめながら処理を追っていきます。
9行目直後における各変数の値が解答に必要になるので、それも確認しながらトレースして言います。

1行目で、現状のKoma配列の並び順を表示します。
2行目で変数yokoに0を代入します。
3行目はループ条件で11行目までかかっています。
配列Komaの要素数―1は5―1で4になりますので
pを1から4まで1ずつ増やしながらループを行います。
まずpに1が代入されます。
4行目が子ループの条件で10行目までかかっています。
Komaの要素数―pは5-1で4になります。
つまりqを1から4まで1ずつ増やしながらループしていきます。
まずqに1が代入されます。

5行目でKoma配列の1番目と2番目を比較します。
5>2は真となるので 6行目の入れ替え処理を行います。
7行目で変数yokoをプラス1した値である1をyokoに上書きします。
Yokosen配列の1番目にqの値である1を代入します。
ここでの各変数の状態を取得しておきます。

4行目に戻って、qに2を代入します。
5行目でKoma配列の2番目と3番目を比較します。
5>4は真なので、6行目の処理で入れ替えを行います。
7行目で変数yokoにプラス1した2をyokoに代入します。
Yokosen配列の2番目にqの値である2を代入します。
ここでの各変数の状態を取得しておきます。


4行目に戻って、qに3を代入します。
5行目でKoma配列の3番目と4番目を比較します。
5>3は真なので、6行目の処理で入れ替えを行います。
7行目で変数yokoにプラス1した3をyokoに代入します。
Yokosen配列の3番目に3を代入します。
ここでの各変数の状態を取得しておきます。

4行目に戻って、qに4を代入します。
5行目でKoma配列の4番目と5番目を比較します。
5>1は真なので、6行目の処理で入れ替えを行います。
ここで一番大きい数の5が右端になったので、5の位置は確定します。

7行目で変数yokoにプラス1した4をyokoに代入します。
Yokosen配列の4番目に4を代入します。
ここでの各変数の状態を取得しておきます。

子ループの終了条件に達したので 3行目の親ループに戻りpに2をします。
4行目の子ループはqを1から3まで繰り返していきます。qに1を代入します。
5行目でKoma配列の1番目と2番目を比較します。
2>4は偽なので、次のループの処理を行います。
ここでの各変数の状態を取得しておきます。

4行目に戻って、qに2を代入します。
5行目でKoma配列の2番目と3番目を比較します。
4>3は真なので、6行目の処理で入れ替えを行います。
7行目で変数yokoにプラス1した5をyokoに代入します。
Yokosen配列の5番目に2を代入します。
ここでの各変数の状態を取得しておきます。

4行目に戻って、qに3を代入します。
5行目でKoma配列の3番目と4番目を比較します。

4>1は真なので、6行目の処理で入れ替えを行います。
ここで2番目に大きい4の位置が確定します。
7行目で変数yokoにプラス1した6をyokoに代入します。
Yokosen配列の6番目に3を代入します。
ここでの各変数の状態を取得しておきます。

子ループの終了条件に達したので 3行目の親ループに戻りpに3をします。
4行目の子ループはqを1から2まで繰り返していきます。qに1を代入します。
5行目でKoma配列の1番目と2番目を比較します。
2>3は偽なので、次のループの処理を行います。
ここでの各変数の状態を取得しておきます。

4行目に戻って、qに2を代入します。
5行目でKoma配列の2番目と3番目を比較します。
3>1は真なので、6行目の処理で入れ替えを行います。
ここで3番目に大きい3の位置が確定します。
7行目で変数yokoにプラス1した7をyokoに代入します。
Yokosen配列の7番目に2を代入します。
ここでの各変数の状態を取得しておきます。

子ループの終了条件に達したので 3行目の親ループに戻りpに4を代入します。
4行目の子ループはqを1から1まで1回だけ繰り返します。qに1を代入します。
5行目でKoma配列の1番目と2番目を比較します。
2>1は真なので、6行目の処理で入れ替えを行います。
ここでKoma配列のすべての並べ替えが完了します。
7行目で変数yokoにプラス1した8をyokoに代入します。
Yokosen配列の8番目に1を代入します。
ここでの各変数の状態を取得しておきます。

子ループ、親ループ共に終了条件になったので
12行目であみだくじを表示し
13行目で並べ替え後の配列を表示して処理を終了します。

今の結果を元に空欄部分を埋めていきます。

画像26


空欄コからスはKoma配列の中身で2、1、0、0の選択肢の順になります。

空欄セからテは、Yokosen配列の要素が横線の位置と合致します。
配列の1番目が1行目と一致するので、配列を縦にして照らし合わせると
2,3,4,2,3,2が空欄部分の答えになります。

画像27

最後に空欄トの部分を見ていきます。

先ほどシミュレーションの通り
子ループが全部完了したら
大きい数字は右端に追いやられ
右端から順次Komaの値が確定するので、確定した部分の判定は再度行う必要はありません。
p番目に大きな値の位置を決めている処理は、先ほどシミュレーションしたように4行目~10行目の処理になるので選択肢としては①が該当します。

20分で解くには難易度が高い問題ですが、トレース力を鍛え、時間を計って解くスピードも上げていきましょう。

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

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

情報関係基礎 : 問題 : 大学入学共通テスト : 大学入試2022 : 大学入試 問題と解答 : 読売新聞オンライン
https://www.yomiuri.co.jp/nyushi/kyotsu/mondai/mondai/1337385_4948

過去のデータ|大学入試センター (dnc.ac.jp)
https://www.dnc.ac.jp/kyotsu/kako_shiken_jouhou/index.html

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





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