新らしくなった基本情報 科目 B アルゴリズムとプログラミング サンプル問題5をJavaにしてみました

2023 年 4 月からIPA (独立行政法人情報処理推進機構)の基本情報技術者試験の制度が変更されました。

ここでは、「基本情報技術者試験 科目 B のサンプル問題」の中から、アルゴリズムとプログラミングの問題を取り上げ、Javaのソースコードを示します。

新人エンジニア研修に参加されている皆様の参考になれば幸いです。

問5

次のプログラム中のaに入れる正しい答えを,解答群の中から選べ。

任意の異なる 2 文字を c1,c2 とするとき,英単語群に含まれる英単語において,c1 の次に c2 が出現する割合を求めるプログラムである。

英単語は,英小文字だけから成る。英単語の末尾の文字が c1 である場合,その箇所は割合の計算に含めない。

例えば,図に示す 4 語の英単語“importance”,“inflation”,“information”,“innovation”から成る英単語群 において,c1 を“n”,c2 を“f”とする。英単語の末尾の文字以外に“n”は五つあり,そのうち次の文字が“f”であるものは二つである。

したがって,求める割合は,2 ÷ 5 = 0.4 である。c1 と c2 の並びが一度も出現しない場合,c1 の出現回数によらず割合を 0 と定義する。

プログラムにおいて,英単語群は Words 型の大域変数 words に格納されている。

クラス Words のメソッドの説明を表に示す。

本問において,文字列に対する演算子“+”は,文字列の連結を表す。

また,整数に対する演算子“÷”は,実数として計算する。

メソッド戻り値説明
freq(文字列型: str)整数型英単語群中の文字列 str の出現回数を返す。
freqE(文字列型: str)整数型英単語群の中で、文字列 str で終わる英単語の数を返す。
表 クラス Words のメソッドの説明

【プログラム】

大域: Words: words /* 英単語群が格納されている */
/* c1の次にc2が出現する割合を返す */
◯実数型: prob(文字型: c1, 文字型: c2)
文字列型: s1 ← c1の1文字だけから成る文字列
文字列型: s2 ← c2の1文字だけから成る文字列
if (words.freq(s1 + s2) が 0 より大きい)
 return  a     
else
 return 0
endif


【解答群】

ア.(words.freq(s1) - words.freqE(s1)) ÷ words.freq(s1 + s2)
イ.(words.freq(s2) - words.freqE(s2)) ÷ words.freq(s1 + s2)
ウ.words.freq(s1 + s2) ÷ (words.freq(s1) - words.freqE(s1))
エ.words.freq(s1 + s2) ÷ (words.freq(s2) - words.freqE(s2))

【Javaプログラム】答は14行目です。

【結果】

0.4

【プログラムの解説】

このプログラムは、与えられた2つの文字(c1とc2)について、c1の後にc2が続く確率を計算します。以下がプログラムの概要です。

  1. Wordsクラスは、英単語の集合を管理するクラスです。words変数には、英単語の配列が格納されています。
  2. freqメソッドは、英単語の集合中で、指定された文字列strが出現する回数をカウントします。indexOfメソッドを使って、文字列strが現れるインデックスを探し、出現回数をカウントします。
  3. freqEメソッドは、英単語の集合中で、指定された文字列strで終わる単語の数をカウントします。endsWithメソッドを使って、文字列strで終わる単語を判定し、カウントします。
  4. probメソッドは、指定された2つの文字(c1とc2)について、c1の後にc2が続く確率を計算します。c1とc2を連結した文字列(s1 + s2)が出現する回数を、c1が出現する回数からc1で終わる単語の数を引いたもので割ります。c1とc2の連結した文字列が出現しない場合、確率は0です。
  5. Q5クラスのmainメソッドでは、probメソッドを使って、与えられた2つの文字('n'と'f')について、c1の後にc2が続く確率を計算し、結果を表示します。