読者です 読者をやめる 読者になる 読者になる

無職になりたい人の日記

今年の目標は無職になることです。

基本情報処理技術者試験平成28年秋午後アルゴリズム問題解説

 

問題

https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2016h28_2/2016h28a_fe_pm_qs.pdf

解答

https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2016h28_2/2016h28a_fe_pm_ans.pdf


設問1

a

p 0

先頭に*があります また、この時点ではsignifは初期値のoffです。
つまりケース8です。
更新処理により、fill文字(*)をセットします。signifはoffのままです。

Patern *
signif off
v 0

 

p 1

次に□です。ケースは1,4,5,6,7です。
さらにsignif off ですので、ケースは1,4,5に絞り込みます。
さらに、Value[v]のあたいで絞り込みます。このときvは初期値の0が入っています。
よってケース1で決定します。
更新処理により、Pattern[1]にfil文字(*)をセットします。signifはoffのままです。
このときvに1を足す処理があることに注意してください。

pattern **
signif off
v 1

 

p 2

次も□です。p1のときと同じなので解説は省略します。
結果は以下のとおりです。

pattern ***
signif off
v 2

p 3
今回は , です。□でもなく■でもなくsignifがoffなのでケース8です。
結果は以下の通りです。vは加算しません。

pattern ****
signif off
v 2

p 4
また□です。vは2なのでValue[2]は0です。よってケース1です。
p1と同様の処理をします。

pattern *****
signif off
v 3

 

p 5
ケース1ですのでp1と同様の処理をします

pattern ******
signif off
v 4

 

p 6
ケース1ですのでp1と同様の処理をします

pattern *******
signif off
v 5

 


p 7
#です。□でもなく■でもなくsignifがoffなのでケース8です。
fill文字をPattern[7]にセットします

pattern ********
signif off
v 5


ループの条件が「pがPattern[]の文字列長未満である限り」ですので、ここでループを終わります。
つまりこの時のPattern が答えです。

イ "*******" になります。

 

b

p0
ケース8です
*
off
0

 

p1
ケース1です。
**
off
1

 

p2
ケース1
***
off
2

 

p3
ケース1
****
off
3

 

p4
ケース8
*****
off
3

 

p5
ケース4
*****1
on
4

 

p6
ケース6
*****12
on
5

 

p7
#です。ケース9です。
*****12#
on
6

 

ループ終了です。
答えは ア"*****12#"です。

 


c


p2までは同じなので割愛します。
p2終了時は以下のとおりです。

***
off
2

 

p3
■です。Value[2]は0です。Value[2+1]つまりValue[3]は1です。ケース2です。

****
on
3

 

p4
.で、signifはonですので、ケース9です。
Pattern[4]をそのまま残します。
****.
on
3

 

p5
Pattern[5]は□です。signifはonです。Value[3]は1です。Value[4]は2です。ケース6です。

****.1
on
4

 

p6
Pattern[6]は□です。signifはonです。Value[4]は2です。Value[5]は+です。ケース7です。

****.12
off
5

 

p7
Pattern[7]は#です。signifはoffです。ケース8です。

****.12*
off
5

ループ終了です。
答えは エ"****.12*"

 

設問2

問題となっている処理があるのはループ内の「Pattern[p] = "□" or Pattern[p] = "■"」が真のときです。この点を注意してください。
dを見ていきます。
dの条件分岐では真のときにPattern[p]にfillを代入しています。偽のときPattern[p]にValue[v]を代入しています。
この処理はつまり、Patternの更新処理です。
Patternの更新処理は3パターンあります。fillを代入、Value[v]を代入、そのまま、です。
dの処理があるのはsigif=offのときです。「そのまま」はsignif=onの場合にしか行いませんので考慮から除外します。
signif=offのときfillとValueの切り分けを行っている条件を探します。
また、解答群はValue[v]の値で条件を作っています。Value[v]でグループ分けをします。

fillの場合
ケース1,2,3
"0"

(ケース8もfillを代入していますが、先述したとおり□か■の場合に限られているので除外します。)

Value[v]の場合
ケース4,5
"1"~"9"

この時点でアかイに絞り込めます。
dの処理を改めてみると、真のときfillを代入しています。したがってValue[v]が0であるが条件になります。

 


e
eはsiginがonのときの処理です。ケース6,7が該当します。
(ケース9もsignifがonですが、先述したとおり□か■の場合に限られているので除外します。)
この2ケースを切り分けるにはValue[v+1]の値をみます。
eが真のときにsignifにoffを代入してます。これはケース7です。
答えはエです。

 

設問3

すみません。よくわかりません……。

答えはエです。