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

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

問題

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

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

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で割った余りを求める演算である。

Eさんは図1と図5の手続きを利用して図6の手続きを作成した。これは候補文字列と正解文字列を比較し、一致した場合にその候補文字列を表示して、一致しない場合に次の候補文字列を生成する、という処理を繰り返す。なお、配列Suutiの各要素は手続きの開始前にすべて0になっている。Eさんはこの手続きが正解文字列「abcdefgh」に対して正しく動作することを確認した。

ところが、Eさんは図6の手続きを完成させる前に、誤って(03)行目のc←0を(01)行目の上に書いて図7のように記述してしまったため、正解文字列とは異なる候補文字列が表示された。Eさんは誤りを確かめるため、図7の手続きの実行過程で変数がどのように変化するかを考えてみた。表1はその一部を抜き出したものである。
この考察により、本来なら「abcdefgh」と表示すべきところを「f( ス )( セ )( ソ )aaaa」と表示してしまった原因を解明でき、手続きを図6のように修正することができた。

( ソ )にあてはまるものを次のうちから1つ選べ。
問題文の画像
  • a
  • b
  • c
  • d
  • e
  • f
  • g
  • h

次の問題へ

正解!素晴らしいです

残念...

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

01

正解は「a」です。

 

図7では、候補文字列が変わっても、文字が一致していればcのカウントは増え続けています。

 

正解文字列「abcdefgh」と表1の候補文字列を比較していくと、候補文字列「aaaaaaaa」の場合は1文字目のみが一致しておりc=1です。

候補文字列は、図4や図5の流れに従って変化するので「abaaaaaa」まではc=1の状態が続きます。

 

「abaaaaaa」の場合は、1文字目と2文字目が一致しているので、cは2増えます。

bbaaaaaa」の場合は、2文字目のみが一致しているので、cはさらに1増えて、ここまででc=4になります。

 

この次からの候補文字列は、2文字目がbのまま、1文字目をアルファベット順に1文字ずつ変化させていきます。

つまり、「cbaaaaaa」の場合は2文字目のみが一致でcは1増えて、

dbaaaaaa」の場合も2文字目のみが一致でcは1増えて...と続きます。

 

候補文字列が表示されるのはc=8のときなので、表示されたのは「fbaaaaaa」と分かります。

 

この問題では候補文字列の4文字目を問われているので、「a」が答えです。

参考になった数0

02

今までの通り、 c は Kouho と Seikai が何文字一致しているか、 となります。

ですが、図7 では、このc が一つの比較ごとにリセットされていない、とわかります。

 

よって、このc が意味するのは、累積された 文字の一致数 となります。 

 

正解文字 abcdefgh について、

比較対象 aaaaaaaa ~ zaaaaaaa では、 aaaaaaaa の1文字目のみ一致で、

累積文字一致数 c = 1 となります。

 

次に、

正解文字 abcdefgh について、

比較対象 abaaaaaa は 2 文字のみ一致しているので、

累積文字一致数 c = 3 となります。

サ : c = 3 となりました。 

(以上サの解説)

 

さらに、

正解文字 abcdefgh について、

比較対象 bbaaaaaa は 1文字一致で、

累積文字一致数 c = 4 となります。

シ : c = 4 となりました。

(以上シの解説)

 

これを c = 8 になるまで続けます。

 

abcdefgh に対して

cbaaaaaa, dbaaaaaa, ebaaaaaa, でそれぞれ2文字目分一致で累積文字一致 c = 7。

最後に、

fbaaaaaa で 2文字目分一致で c = 8 となりました。

 

よってスセソ = baa とわかります。

参考になった数0

03

この問題のポイントは、変数cの値をループ毎になぜリセットする必要があるかを考えることです。

 

iを0から7まで1ずつ増やしながらある候補文字列が正解文字列と一致するか調べたとき、正解文字列と1文字でも一致していればcの値は増えることになります。ここで、次の候補文字列と比較するときにcの値をリセットしないとcの初期値が0でない状態で始まってしまいます。

 

本来は、正解文字列とすべての文字が一致している候補文字列になったときにcが8になります。しかしリセットを行わないと、様々な候補文字列を調べていった累積の一致数が8になったときにcが8になってしまうため、誤った表示が行われてしまいます。

 

この誤った表示方法の場合、[a,a,a,a,a,a,a,a,]で1文字一致で+1、[a,b,a,a,a,a,a,a]で2文字一致で+2、[b,b,a,a,a,a,a,a]から[f,b,a,a,a,a,a,a]の5回でも1文字一致で+1かける5で+5され、cが8になります。

よって、 正解はcが8になったときの候補文字列である[f,b,a,a,a,a,a,a] の a になります。

参考になった数0