状態遷移表を使って文字列を検査する問題をやさしく解説

広告

基本情報技術者試験では、文字列を左から順番に読み取りながら、現在の状態を変化させていく問題が出題されます。

このような問題では、状態遷移表状態遷移図を使って、文字列が条件を満たしているかどうかを判定します。

今回は、状態遷移表を使って、どの文字列が不合格になるかを考える問題です。


問題

表は、文字列を検査するための状態遷移表である。
検査では、初期状態を a とし、文字列の検査中に状態が e になれば不合格とする。

解答群で示される文字列のうち、不合格となるものはどれか。
ここで、文字列は左端から検査し、解答群中の△は空白を表す。

現在の状態空白数字符号小数点その他
aabcde
babede
cabede
daeeee

解答群

ア +0010
イ -1
ウ 12.2
エ 9△


状態遷移表とは何か

状態遷移表とは、簡単に言うと、

今いる場所と、次に読んだ文字によって、次にどこへ行くかを決める表

です。

例えば、現在の状態が a で、次に読んだ文字が「符号」だったとします。

このとき、表の

行 a × 列 符号

を見ます。

表を見ると、行 a、列 符号 のところは c です。

つまり、

a → c

に状態が変わります。

状態遷移表は、文字列を読むためのルート表のようなものです。


状態 e は不合格を表す

この問題で一番大事なのは、状態 e の意味です。

状態 e は、検査失敗、つまり不合格状態です。

途中で一度でも e に入ったら、その時点で不合格です。

逆に、最後まで読んでも e に入らなければ合格です。

a〜d:まだ合格の可能性がある状態
e  :不合格状態

ここを最初に押さえると、問題がかなり楽になります。


表ではなく「道をたどる」と考える

初学者にとって、状態遷移表は少し読みにくいです。

そこで、右上のイラストのように、状態を丸で表した図として考えると分かりやすくなります。

例えば、

a で数字を読む → b に進む
b で小数点を読む → d に進む
d で数字を読む → e に進む

というように、文字を読むたびに、状態という場所を移動していきます。

これは、すごろくや迷路に近い感覚です。

読んだ文字が、次に進む道を決めると考えるとよいです。


選択肢ア「+0010」を確認する

まず、アの +0010 を確認します。

最初の状態は a です。

開始:a

+ :符号 a → c
0 :数字 c → b
0 :数字 b → b
1 :数字 b → b
0 :数字 b → b

最後まで読んでも、状態 e にはなっていません。

したがって、アは合格です。

ア +0010 → 合格

符号の後に数字が続いているので、この表では問題なく受け入れられます。


選択肢イ「-1」を確認する

次に、イの -1 を確認します。

開始:a

- :符号 a → c
1 :数字 c → b

こちらも、途中で状態 e になっていません。

したがって、イも合格です。

イ -1 → 合格

符号が1つあり、その後に数字が来ているので、これも問題ありません。


選択肢ウ「12.2」を確認する

次に、ウの 12.2 を確認します。

ここがこの問題のポイントです。

開始:a

1 :数字  a → b
2 :数字  b → b
. :小数点 b → d
2 :数字  d → e

小数点を読んだ時点では、状態は d です。

まだ不合格ではありません。

しかし、その次に数字の 2 を読むと、

d → e

となります。

状態 e は不合格状態なので、この時点で検査失敗です。

したがって、ウは不合格です。

ウ 12.2 → 不合格


選択肢エ「9△」を確認する

最後に、エの 9△ を確認します。

△は空白を表します。

開始:a

9 :数字 a → b
△:空白 b → a

途中で状態 e になっていません。

したがって、エは合格です。

エ 9△ → 合格

空白を読むと状態が戻る場合もあります。
このように、空白だから必ず不合格になるとは限りません。

あくまで、表に従って判断します。


答え

不合格になるのは、次の選択肢です。

ウ 12.2

理由は、小数点の後に数字を読んだとき、状態が e になるからです。

1 :a → b
2 :b → b
. :b → d
2 :d → e

したがって、答えは  です。


この問題で大切な考え方

この問題では、文字列そのものを見て、

これは正しそう
これは変そう

と感覚で判断してはいけません。

大切なのは、次の手順です。

1. 最初の状態 a から始める
2. 文字を左から1文字ずつ読む
3. 現在の状態と文字の種類で表を見る
4. 次の状態へ移動する
5. e になったら不合格
6. 最後まで e にならなければ合格

この手順を守れば、状態遷移表の問題は確実に解けます。


初学者がつまずきやすいポイント

この問題でつまずきやすいのは、12.2 を普通の小数として見てしまうことです。

日常的には、12.2 は正しい数値に見えます。

しかし、この問題では、一般的な数値のルールではなく、問題で与えられた状態遷移表のルールがすべてです。

つまり、

現実の感覚ではなく、表に従う

ことが大切です。

表では、状態 d のときに数字を読むと e になります。

だから、12.2 は不合格になります。


状態遷移表はプログラムの if 文に近い

状態遷移表は、プログラムで書くと、次のような考え方に近いです。

現在の状態が a で、読んだ文字が数字なら b へ
現在の状態が b で、読んだ文字が小数点なら d へ
現在の状態が d で、読んだ文字が数字なら e へ

つまり、状態遷移表は、

現在の状態
読んだ文字
次の状態

をまとめたものです。

プログラムで文字列チェックを行うときにも、この考え方は使われます。


オートマトンとして考える

このような仕組みは、情報処理の分野ではオートマトンと呼ばれます。

オートマトンは、入力された文字を1つずつ読みながら、状態を変化させていく仕組みです。

今回の問題では、

文字列を読む
状態を変える
不合格状態 e に入るかどうかを確認する

という流れになっています。

基本情報技術者試験では、難しい理論を問うというよりも、表や図を正しくたどれるかが問われます。


まとめ

状態遷移表の問題は、見た目よりも手順が大切です。

今回の問題では、最初の状態は a です。

文字を左から順に読み、表に従って状態を変えていきます。

状態 e になったら不合格です。

各選択肢を確認すると、

ア +0010 → 合格
イ -1  → 合格
ウ 12.2 → 不合格
エ 9△  → 合格

となります。

したがって、答えは、

ウ 12.2

です。

この問題を解くコツは、文字列を見た目で判断するのではなく、状態遷移表というルールブックを1文字ずつたどることです。

訪問数 3 回, 今日の訪問数 3回

広告