基本情報技術者試験のサンプル問題を解こう!(14)(科目B)「二つの配列を比較する」

スポンサーリンク
IT系

基本情報技術者試験のサンプル問題(科目B)を解いてみよう。

今回のテーマは、「二つの配列を比較する」である。

関数 simRatio は,引数として与えられた要素数 1 以上の二つの文字型の配列 s1と s2 を比較し,要素数が等しい場合は,配列の並びがどの程度似ているかの指標として,(要素番号が同じ要素の文字同士が一致する要素の組みの個数 ÷ s1の要素数)を実数型で返す。例えば,配列の全ての要素が一致する場合の戻り値は 1,いずれの要素も一致しない場合の戻り値は0である。
なお,二つの配列の要素数が等しくない場合は,-1を返す。
関数 simRatio に与える s1,s2 及び戻り値の例を表に示す。プログラムでは,配列の領域外を参照してはならないものとする。

解答群
ア s1[i] ≠ s2[cnt]
イ s1[i] ≠ s2[i]
ウ s1[i] = s2[cnt]
エ s1[i] = s2[i]

正解:エ

問題の概要

この問題では、2つの文字列配列(文字の並び) s1s2 を受け取り、その「類似度(似ている割合)」を計算する関数 simRatio の処理を読み解く内容である。


表の内容を確認しよう

s1s2戻り値
[“a”,”p”,”p”,”l”,”e”][“a”,”p”,”p”,”l”,”e”]1
[“a”,”p”,”p”,”l”,”e”][“a”,”p”,”r”,”i”,”l”]0.4
[“a”,”p”,”p”,”l”,”e”][“m”,”e”,”l”,”o”,”n”]0
[“a”,”p”,”p”,”l”,”e”][“p”,”e”,”n”]-1
  • 同じ位置の文字がすべて一致 → 1(完全一致
  • 文字列の長さが違う → -1(比較不能)
  • 一部だけ一致 → 0.8など(類似度)

何をしている関数かを確認しよう

この simRatio 関数は以下のような処理をしている。

  1. s1とs2の長さが異なれば-1 を返す(比較できないから)
  2. 長さが同じなら、1文字ずつ比較して「一致している場所」をカウントする
  3. 一致した回数 ÷ 文字数(要素数) = 類似度 を計算して返す

コードの仕組みから cnt の役割を考えてみよう

関数 simRatio(文字型の配列: s1, s2)

整数型 i, cnt ← 0

if (s1の要素数 ≠ s2の要素数)
    return -1
endif

for (i を 1 から s1の要素数 まで 1 ずつ増やす)
    if (【空欄】)
        cnt ← cnt + 1
    endif
endfor

return cnt ÷ s1の要素数

cnt の役割を確認しよう

cnt はこの関数の中心的な役割を果たすカウンターで、
s1とs2で同じ位置に、同じ文字があった回数」を数えている。

たとえば、

s1 = ["a", "p", "p", "l", "e"]
s2 = ["a", "p", "p", "r", "e"]

この場合、以下の位置で文字を比較する。

is1[i]s2[i]一致するか?cnt
1“a”“a”1
2“p”“p”2
3“p”“p”3
4“l”“r”3
5“e”“e”4

➡ 最終的に cnt = 4
➡ 要素数は5 → 4 ÷ 5 = 0.8 を返す。


空欄に入るべき式は?

「同じ位置の文字が一致しているか?」を判定するのが、 if 文である。

したがって、空欄に入るのは、

s1[i] = s2[i]

となる。


他の選択肢も検討してみよう

選択肢内容評価・理由
s1[i] ≠ s2[cnt]❌ cntはカウンター。比較対象に使うのは誤り。
s1[i] ≠ s2[i]❌ 不一致を調べてどうするのか。目的に合わない。
s1[i] = s2[cnt]❌ cntはインデックスではないので不適切である。

まとめ

  • cnt は、一致した文字の個数を数える変数である。
  • 関数は「文字列の一致割合(類似度)」を返す。
  • 文字列長が違えば -1 を返す。
  • 空欄には s1[i] = s2[i] を入れるのが正解となる。

コメント

タイトルとURLをコピーしました