基本情報技術者試験のサンプル問題(科目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つの文字列配列(文字の並び) s1
と s2
を受け取り、その「類似度(似ている割合)」を計算する関数 simRatio
の処理を読み解く内容である。
表の内容を確認しよう
s1 | s2 | 戻り値 |
---|---|---|
[“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
関数は以下のような処理をしている。
- s1とs2の長さが異なれば →
-1
を返す(比較できないから) - 長さが同じなら、1文字ずつ比較して「一致している場所」をカウントする
- 一致した回数 ÷ 文字数(要素数) = 類似度 を計算して返す
コードの仕組みから 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"]
この場合、以下の位置で文字を比較する。
i | s1[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]
を入れるのが正解となる。
コメント