基本情報技術者試験の午後問題が変わりました.
以前よりもプログラムを読み取る力が求められるようになりましたね.
科目B問題を解けるようになるにはプログラムを元に自分でコードを書いてみるのが1番良いでしょう.
今回は科目Bサンプル問題 問5「文字の出現確率を求めるプログラム」の解説とそのコードを紹介します.
Pythonで書いてみたので是非手元で実行してみてください.
科目Bサンプル問題 問5 文字の出現確率を求めるプログラム
問題文は以下のとおりです.
英単語に使われているアルファベットを数える問題です.
実はこの問題,処理内容が分からなくても解けます.
問題文を見ると複雑そうに感じますが計算式に直してみましょう.
指定するアルファベットの並び(cf)が出現する回数 / (英単語に含まれるすべてのc1(n) - 末尾のc1(n))
この計算式に当てはまるのは「ウ」と「エ」しかありません.
「ウ」と「エ」の選択肢の違いは分母の words.freq() の処理です.
c1はs1を意味しているのでs1を使っている「ウ」が答えになります.
科目Bのようなプログラム問題でも処理をすべて読まなくても解ける問題もありました.
このような問題で時間を節約したいですね.
Pythonでプログラムを書く
問5に掲載されているプログラムを元にPythonで書き直しました.
プログラムと全く一緒のコードは書けなかったので一部改変しています.
class Words:
def __init__(self):
# 英単語を入れる配列
self.words = []
# words配列に英単語を追加する
def add_word(self, word):
self.words.append(word)
# 英単語群中のalphabetの出現回数を返す
def freq(self, alphabet: str) -> int:
# アルファベットの出現回数
count = 0
# words配列をループする
for word in self.words:
# 英単語の文字数を取得する
count += word.count(alphabet)
return count
# 英単語群の中で,文字列strで終わる英単語の数を数える
def freqE(self, alphabet: str) -> int:
count = 0
for word in self.words:
if (word.endswith(alphabet)):
count += 1
return count
# c1の次にc2が出現する割合を返す
def prob(self, c1: str, c2: str) -> int:
s1 = c1
s2 = c2
# コード一部改変
if (self.freq(s1 + s2) > 0): # words.freq(s1 + s2) > 0
return self.freq(s1 + s2) / (self.freq(s1) - self.freqE(s1)) # words.freq(s1 + s2) / (words.freq(s1) - words.freqE(s1))
else:
return 0
word_list = Words()
# 配列に英単語を入れる
word_list.add_word("importance")
word_list.add_word("inflation")
word_list.add_word("information")
word_list.add_word("innovation")
# c1とc2の値を指定
c1 = "n"
c2 = "f"
print(word_list.prob(c1, c2))
例題に書いてあった英単語は4つです.
- importance
- inflation
- information
- innovation
アルファベットの指定は n と f でした.
4つの英単語の中でnは全部で8つあります.
ただし単語の末尾にあるnは数えないので3つは対象外です.
よって対象内のnは8-3=5と分かりました.
nfで連続しているは2箇所です.
最終的な数値は 2 / 5 = 0.4 と求まりました.
プログラムの結果も0.4となり計算結果と一致していますね.
プログラムに間違いはなさそうです.
まとめ
今回は科目Bサンプル問5「文字の出現確率を求めるプログラム」について紹介しました.
詳しい処理はコメントで補完しています.
コメントを読むと処理内容が分かると思います.
科目Bは難しい問題が多いですが,処理内容を完全に理解しなくても解けるこの問題はチャンス問題でしたね.
似たような問題は落とさないようにしましょう!