文字列処理の問題の解き方
飛岡拓希公開
文字列の問題は、配列の問題とほとんど同じです。文字列を1文字ずつ番号付きで書き、配列と同じように追います。特に気を付けるのは、ループが終わった後ろの1行です。
文字の操作は、問題文で定義される
擬似言語には、文字列を扱う決まった関数がありません。 そのため科目B の文字列の問題では、問題文の中で次のように定義されます。
ここで、s[k] は文字列 s の k 番目の文字を返す。 sの文字数 は文字列 s に含まれる文字の個数を返す。
この定義の一文を、プログラムより先に読みます。「k 番目」が 1 から数えるのか、範囲外を指したらどうなるのか、文字と文字列を + でつなげられるのか、は問題ごとに違います。 ほかの言語の知識で補わず、書かれているとおりに読んでください。
文字列は、配列と同じように番号付きで書きます。
番号 : 1 2 3 4 5 6 文字 : a a a b c c
例:同じ文字が続く数を数える
次の関数は、同じ文字が続くまとまりを「文字+続いた数」に置き換えます。"aaabcc" なら "a3b1c2" を返します。 ここで、toStr(n) は整数 n を文字列にしたものを返すとします。
○文字列型: compress(文字列型: s)
文字列型: result ← ""
整数型: count ← 1
整数型: i
for (i を 2 から sの文字数 まで 1 ずつ増やす)
if (s[i] = s[i - 1])
count ← count + 1
else
result ← result + s[i - 1] + toStr(count)
count ← 1
endif
endfor
result ← result + s[sの文字数] + toStr(count)
return result1回ずつ表に書くと、こうなります。
| i | 比べるもの | count と result |
|---|---|---|
| 2 | a と a → 同じ | 2 / "" |
| 3 | a と a → 同じ | 3 / "" |
| 4 | b と a → 違う | 1 / "a3" |
| 5 | c と b → 違う | 1 / "a3b1" |
| 6 | c と c → 同じ | 2 / "a3b1" |
| ループの後 | 最後のまとまりを足す | "a3b1c2" |
ループの後ろの1行を見落とさない
この関数で一番大事なのは、endfor の後ろにある1行です。 ループの中で result に足すのは「違う文字が来たとき」だけなので、 最後のまとまり(ここでは cc)は、ループの中では一度も足されません。
この行が無いと、戻り値は "a3b1" になります。「区切りが来たら前のまとまりを確定する」形の処理は、最後のまとまりだけ区切りが来ないので、 ループの外で確定させる必要があります。穴埋めで狙われやすいのは、まさにこの行です。
表で追うときは、ループの最後の回を書いたあとに、「ループの後」という行を必ず1行足します。ここを書き忘れると、自分のトレースでも同じ取りこぼしが起きます。
文字列処理の問題:
- 文字列の各文字を2回繰り返す処理を穴埋めする(難易度 2・登録なしで解けます)
- 回文かどうかを判定する処理を穴埋めする(難易度 3・登録なしで解けます)
空の文字列と1文字の文字列で試す
選択肢を絞りきれないときは、短い入力で試します。1文字の "a" を上の関数に入れると、ループは1回も回らず(i が 2 から 1 までなので)、 ループの後ろの1行だけで "a1" になります。
逆に、空の文字列 "" を入れると、ループの後ろで s[0] を読んでしまいます。 問題文が「s は1文字以上」と断っているのは、こういう端を除くためです。 断り書きがある端は試さなくてよく、無い端は試す価値があります。
ほかの分野の解き方
解いたあとに解説を読む
このサイト(極とれ)の問題は、解いたあとにトレースの手順と、 選択肢ごとに「なぜ違うか」が開きます。登録なしで解けます。
文字列処理の練習問題を見る記法は IPA が公開しているサンプル問題・公開問題の記述形式に基づいています。 出題形式は改訂されることがあるため、受験の際は IPA の公表内容をご確認ください。
この記事について
書いているのは飛岡拓希です。基本情報技術者試験の科目B だけを扱う学習サービス「極とれ」を 1人で作って運営しています。試験には高校3年生のときに合格しました(そのときの記録)。
数字を載せるときは、出典の資料を自分で開いて数えた値だけを使い、いつ時点のものかを本文に書いています。 誤りに気づいたら goku.tore9@gmail.com までお知らせください。読んだ感想はフォームからも送れます。