大学入学共通テスト(情報) 過去問
令和4年度(2022年度)追・再試験
問38 (<旧課程>情報関係基礎(第3問) 問6)

このページは閲覧用ページです。
履歴を残すには、 「新しく出題する(ここをクリック)」 をご利用ください。

問題

大学入学共通テスト(情報)試験 令和4年度(2022年度)追・再試験 問38(<旧課程>情報関係基礎(第3問) 問6) (訂正依頼・報告はこちら)

次の文章を読み、後の問いに答えよ。

Eさんは英小文字だけによる長さ8文字のパスワードを使っているが、悪意を持った第三者が長さ8のあらゆる文字列をもれなく試せば、いずれはパスワードを当てられてしまうことに気付いた。そこでEさんは、プログラムを作る練習としてこのことをコンピュータで確かめてみることにした。

Eさんは初めに、自分が使っているパスワードと、プログラムで生成する文字列の一つとが一致するか確かめる手続きを作成することにした。なお、ここでは8文字ちょうどのパスワードだけを考えることにする。
自分が使っているパスワードを正解文字列と呼び、配列Seikaiの要素Seikai[0]からSeikai[7]に順に1文字ずつ格納されているとする。また、プログラムで生成する文字列を候補文字列と呼び、配列Kouhoの要素Kouho[0]からKouho[7]に順に1文字ずつ格納されているとする。Eさんは、候補文字列と正解文字列で一致している文字を数え、文字列全体が一致しているときに候補文字列を表示する手続きを図1のように作成した。

Eさんは配列Suutiの内容をすべての候補文字列に対応するように変化させるために、図4の手順を考えた。図4では、配列Suutiの8要素がすべて0である1番目から、左端のSuuti[0]を1ずつ増やしていき、26番目の次はSuuti[0]を0に戻してSuuti[1]を1増やす、という手順を繰り返している。268番目の次は1番目に戻るとする。配列Suutiの要素を変化させる際の一時的な状態を、図4では点線により示している。この方法ですべての候補文字列を順に得るために、次の候補文字列に対応するよう配列Suutiを変化させる手続きを、図5のように作成した。図4の268番目から1番目に戻るときに、変数jが配列Suutiをはみ出さないよう注意して変数mを設定した。また、変数tは図4の点線の状態を扱うためのものであり、a%bはaをbで割った余りを求める演算である。

( カ )にあてはまるものを次のうちから1つ選べ。
問題文の画像
  • j−1
  • j
  • j+1
  • m
  • n
  • Suuti[j−1]
  • Suuti[j]
  • Suuti[j+1]

次の問題へ

正解!素晴らしいです

残念...

この過去問の解説 (3件)

01

正解は「n」です。

 

図5の(06)~(10)は、図4の26~27番目のように、配列Suutiの各要素の値が25を超えたら(26以上になったら)0に戻す処理です。

 

配列Suutiに実際に格納する数値がt%nであり、変数tは図4の点線の状態を扱うためのものです。

 

つまり、t%nが以下になるようなnを求めます。

・tが1~25の場合はそのままtと同じ値

・tが26の場合は0

 

上記の考え方でn=6と分かるので、「tが26以上」を表すためにnを使用します。

参考になった数0

02

この問題では、配列内の数字が 「26」になったらその部分を次の位に繰り上げをするという処理を求められます。

---

(01行目) から (10行目) を一通りプログラムを擬似再現してみましょう。 

Suuti[0] = 25、Suuti[1] ~ Suuti[7] = 0 であるとしてみます。

 

(01行目) t ← 25 + 1  ※25+1=26

(02~03行目) m←7, n←26

(04行目) Suuti[0] ← 26 % 26 ※26%26=0

(05行目) j ← 0

(06行目) j < m かつ t ≧ ? の条件式

 

ここで、(06行目)では t が 26以上の時、繰り上げ処理をすればよいので、

26を指定したいとわかります。

ここでは、 n = 26 より n を指定すればよいでしょう。

よって正答は n とわかりました。

まとめ

複雑な問題状況では、一度プログラムをトレース (順番に擬似再現してみること) をすると解きやすくなるかもしれません。

参考になった数0

03

この問題のポイントは、図5で出てくる変数がそれぞれ何の操作をするためのものか考えることです。

 

6行目から10行目のループでは繰り上げの処理が行われています。なので、tがいくつ以上の時に繰り上げの処理を行う必要があるかを考えればよいです。

配列の1つの要素には1~25までの数値が入り、26の数値が入ったときに繰り上げを行うことから、繰り上げの処理はtが26以上の時に必要になります。なので、空欄には26が格納されている変数を入れる必要があります。

 

ここで、3行目で定義されているnは、4行目と9行目にtからnを割った余りを求めるために使用されています。

この" t % n"の値がsuutiに代入されていることを考えると、" t % n"はtを1ずつ増やしていったときに1~25の範囲に数値を抑えるための操作であるということが読み取れます。したがってnに格納する数値は26になります。

 

よって、正解は n になります。

参考になった数0