平成27年度春期午後のC言語問題である問9の私の解き方・考え方について解説していきます。
問題
IPAの公式サイトで公開されています。このページでは問9についての解説を行います。
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2015h27_2/2015h27a_fe_pm_qs.pdf
問題の概要
入力された文字列を暗号化する問題です。暗号と聞くと難しそうに感じるかもしれませんが、この問題では単純に他の文字に置き換えるだけです。
[プログラム]では青枠内で文字str[p]の換字表における行位置と列位置を特定し、緑枠内で特定した行位置と列位置から置換後の文字を文字列str[ ]に格納する処理が行われています。
基本的にこの置換は二文字ずつ行われますが、文字列長が奇数の場合は最後の一文字をオレンジ枠内で個別に置換処理しています。
二文字ずつの置換のパターンは下記の4つになります。
(図内では1文字目を青四角、2文字目をオレンジ枠で示しています。点線は置換前で実線は置換後をそれぞれ表しています。以降も同様です)
二つの文字が同じ場合
行位置と列位置ともに+1移動させた位置の文字に置換
二つの文字の行位置が同じ場合
二つの文字を入れ替え
二つの文字の列位置が同じ場合
二文字とも列位置を+1分移動させた位置の文字に置換
二つの文字の行位置と列位置それぞれが異なる場合
二つの文字の行位置のみ入れ替えた位置の文字に置換
また文字列長が奇数の場合、最後の一文字は下記のように置換されます。
最後の一文字の場合
中心に対して点対称の位置の文字に置換
アルファベットの場合、大文字は小文字に、小文字は大文字に置換されます。
以上の置換パターンを頭に入れて設問を読んでいくと分かりやすいと思います。
スポンサーリンク
設問1
入力される平文の最初の文字は”F”ですので、換字表より列位置であるcolは7、行位置であるrowは4となります。
ですので[ a ]の答えは7、[ b ]の答えは4です。
βの行が初めて実行されるときは、初めてif(i == 2)が成立する時であり、平文の2文字目を置換した後になります。
2文字目は”u”ですので、列位置は7、行位置は1となります。
[プログラム]では、この”u”と1文字目の”F”の組み合わせより、文字の置換による暗号化が行われます。
パターンとしては、列位置が”F”と”u”ともに7ですので、「2つの文字の列位置が同じ場合」のパターンで置換が行われます。下の図のように置換が行われます。置換後の1文字目は”E”、2文字目は”v”に置換されます。ですので、[ c ]の答えは”v”となります。
続いて[ d ]を考えていきましょう。βが5回目ですので、9文字目と10文字目の置換が行われた後の状態になります。そのため置換対象となる文字が格納されているstr[ ]の添字を示すpos[ ]に関しては、pos[0]は8、pos[1]は9(str[ ]配列は0から始まる)であり、両方とも文字は△となります。
ですので、「2つの文字が同じである場合」のパターンによって置換が行われます。列位置に関しては+1すると最大サイズ12を超えてしまいますので、0に戻ることに注意が必要です((rp[0] + 1) % RSIZE)。
[ e ]に関してはβが6回目のpos[1]の値が問われています。βが6回目なので今まで通りであれば11文字目と12文字目の置換が行われた後の状態のようにも思えますが、12文字目の”(“は換字表に存在しない文字ですので、この”(“を飛ばして次の文字を用いて暗号化が行われます。ですので、実際にはβが6回目実行されるときは、11文字めと13文字目の置換が行われた後の状態になります。ですので、pos[0]は10、pos[1]は12となります。
したがって[ e ]の答えは12です。
設問2
置換は2文字ずつ行われますので、”IP”と”A”との組み合わせで置換が行われます。これもどのパターンに当てはまるかを考えて実際に置換処理をしてみると答えは導けます。
“IP”は「二つの文字の行位置と列位置それぞれが異なる場合」のパターンとなりますので、二つの文字の行位置のみ入れ替えた位置の文字に置換されます。
ですので、1文字目は”V”、2文字目は”C”に置換されます。
“A”は「最後の一文字の場合」のパターンとなりますので、中心に対して点対称の位置にある”a”に置換されます。
ですので3文字目は”a”に置換されます。
したがって[ f ]の答えは”VCa”となります。
解いてみた感想
パターンごとにどう置換されるかを整理して解くてかなりわかりやすくて簡単でした。この暗号化にどういうメリットがあるのかはよくわかりませんが・・・。
★オススメページ★
下記ページから他の回の解説もたどれます。他の回のC言語問題の解き方がわからない場合は是非読んでみてください!
本ページの図・プログラム・問題文について
図やプログラム、問題文はIPA公開の過去問題から引用しています。また図やプログラムに関しては説明に必要な部分に関してのみ加工して使用させていただいております。
出典:平成27年度 春期 基本情報技術者試験(FE)試験区分 午後 問9