科目Bの文字列問題の解き方|1文字ずつ取り出す処理を追うコツ

公開日: 2026-09-26

文字列の問題になると、何文字目を見ているのか途中で分からなくなる。

配列の問題なら追えるのに、文字列になった途端に手が止まっていませんか?

科目Bの文字列問題は、見た目こそ特殊ですが、中身は配列の問題とほとんど同じです。1文字ずつ取り出し、前の文字や目的の文字と比べ、結果を積み上げていく。やっていることはこの繰り返しです。

つまずく原因の多くは、処理が難しいことではありません。いま何文字目を見ていて、何が結果にたまっているのかを、頭の中だけで覚えようとすることです。

私はエンジニアとして10年以上、Webシステムの開発や運用に携わってきました。実務でも、入力された文字列をチェックしたり整形したりする処理は毎日のように書きます。

そして、不具合が出やすいのは決まって最初の1文字と最後の1文字です。この記事でも、その境目に注目しながら、文字列問題を追う手順をお伝えします。

科目B全体の出題の姿を先に確かめておきたい人は、親記事から読むと位置づけがつかみやすくなります。

【関連記事】基本情報技術者試験の科目Bとは?擬似言語・アルゴリズム対策を初心者向けに解説

この設問は何を聞いているのか

最初に、文字列問題で何が問われているのかを押さえましょう。ここが分かると、読むべき場所が自然に絞れます。

文字列問題で問われるのは、文字列型の文法ではありません。与えられた文字列に処理を当てたとき、最後にどんな値が返るか、または空欄にどの式が入れば目的の結果になるかです。

出題の型はいくつかありますが、処理の中身で分けるとおおむね次のようになります。

型 やっていること 結果として返るもの
数える 特定の文字や条件に合う文字を数える 整数
探す ある文字や部分文字列が何文字目にあるかを調べる 位置、見つからなければ特別な値
判定する 回文かどうか、形式に合っているかを調べる 論理型の真偽
作り変える 並べ替え、置き換え、圧縮などで新しい文字列を作る 新しい文字列

どの型も、1文字ずつ取り出して何かと比べる、という骨組みは共通です。違うのは、比べた結果をどこにためるかだけです。

文字列は文字の配列だと考える

文字列問題を楽にする一番のコツは、文字列を文字が一列に並んだ配列だと思うことです。s の i 文字目という書き方は、配列の要素を添字で取り出すのと同じ意味です。

擬似言語の配列と同じく、文字の位置も1から数える形で書かれるのが一般的です。問題文の説明に位置の数え方が書かれていたら、最初に必ず確認しておきましょう。

1文字ずつ取り出す基本の形や、文字型と文字列型の違いに不安がある人は、文法を扱ったこちらの記事で先に固めておくと読みやすくなります。

【関連記事】擬似言語の文字列処理がわからない人へ|1文字ずつ取り出す読み方と回文判定を解説

まず目を付ける場所

問題のコードを開いたら、1行目から順に読み込まないでください。先に見る場所を決めておくと、読む時間がぐっと短くなります。

見るのは次の3か所です。上から順に確認すると、処理の全体像がすばやくつかめます。

順番 見る場所 確かめること
1 関数の宣言と戻り値 何を受け取り、何を返す処理なのか
2 繰返しの範囲 何文字目から何文字目まで見るのか
3 繰返しの後ろの行 ループを抜けたあとに何か処理が残っていないか

特に3つ目は見落とされがちです。文字列を作り変える問題では、最後の塊をループの外で処理することがよくあります。

繰返しの開始位置に理由がある

繰返しが1文字目からではなく、2文字目から始まっているコードがあります。これは、1文字目をループの前で取り出しておき、2文字目以降と比べるためです。

こうした形を見たら、前の文字を覚えておく変数がどこかにあるはずだと考えてください。その変数が、比べる相手の役割を持っています。

ループの範囲や回数の読み方に自信がない人は、繰返しの問題を扱ったこちらの記事もあわせてどうぞ。

【関連記事】科目Bの繰返し問題が解けない人へ|ループ回数を追うコツ

例題:同じ文字の連続を数えて圧縮する

ここからは、例題を使って実際に追ってみます。IPAの公開問題そのものではなく、科目Bでよく見かける形をもとに作った類題です。

処理の内容は、同じ文字が続く部分を、文字と続いた数の組に置き換えるというものです。たとえば AAB なら、A が2つ、B が1つなので A2B1 になります。

○文字列型: compress(文字列型: s)
  文字列型: result
  文字型: prev
  整数型: i, count
  result ← ""
  prev ← s の 1 文字目
  count ← 1
  for (i を 2 から s の文字数 まで 1 ずつ増やす)
    if (s の i 文字目 が prev と等しい)
      count ← count + 1
    else
      result ← result の末尾に prev と count を連結した文字列
      prev ← s の i 文字目
      count ← 1
    endif
  endfor
  result ← result の末尾に prev と count を連結した文字列
  return result

先ほどの3か所を当てはめてみましょう。受け取るのは文字列 s で、返すのは新しい文字列 result です。

繰返しは2文字目から始まっています。1文字目を prev に入れておき、それと比べるための形です。

そして、ループの後ろにも result を伸ばす行が1つあります。ここが、この問題のいちばん大事な場所です。

トレース表で変数を追う

では、s が AABCCC のときの動きを追ってみます。表の列は、ループの変数 i、取り出した文字、通った分岐、そして変化する3つの変数です。

i s の i 文字目 分岐 prev count result
開始前 ― ― A 1 空
2 A 等しい A 2 空
3 B 等しくない B 1 A2
4 C 等しくない C 1 A2B1
5 C 等しい C 2 A2B1
6 C 等しい C 3 A2B1
ループ後 ― ― C 3 A2B1C3

表を見ると、result が伸びるのは文字が切り替わった瞬間だけだと分かります。同じ文字が続いている間は、count だけが増えていきます。

最後の C の塊は、ループの中では一度も result に書き出されていません。ループを抜けたあとの1行があるから、C3 が付け足されて答えが完成します。

表を書くときの小さな工夫

文字列問題のトレースでは、元の文字列を横に書き出し、上に位置の番号を振っておくと迷いません。A A B C C C の上に 1 2 3 4 5 6 と書くだけで、何文字目を見ているかが一目で分かります。

result の列は、毎回全部を書き直さなくてもかまいません。変わった行だけ書き、変わらない行は同じと書いておけば、手が遅くなりすぎずに済みます。

トレース表の書き方そのものをもっと詳しく知りたい人は、こちらの記事が参考になります。

【関連記事】擬似言語のトレース表の書き方|科目Bで変数の値を追う手順を解説

探す型の問題にも同じ読み方が使える

今回は作り変える型の例題でしたが、探す型の問題でも読み方は変わりません。たとえば、文字列の中から目的の文字が最初に現れる位置を返す処理を考えてみましょう。

○整数型: findChar(文字列型: s, 文字型: target)
  整数型: i
  for (i を 1 から s の文字数 まで 1 ずつ増やす)
    if (s の i 文字目 が target と等しい)
      return i
    endif
  endfor
  return -1

戻り値は整数で、見つかればその位置、見つからなければ -1 を返します。繰返しの途中で return しているので、目的の文字が複数あっても最初の1つで処理が終わります。

ここでも、ループの後ろの行に目を向けてください。最後まで見つからなかったときにだけ、-1 を返す行にたどり着きます。

s が BANANA で target が N なら、返るのは3です。最後に現れる位置の5と迷わせる選択肢がよく並ぶので、途中で return しているかどうかを必ず確認しましょう。

どちらの型でも、戻り値、繰返しの範囲、ループの後ろの行という3か所の見方はそのまま通用します。型ごとに解き方を覚え直す必要はありません。

間違いやすい選択肢の見分け方

文字列問題の選択肢は、正解とほんの少しだけ違う文字列が並ぶことが多いです。どこが違うのかを見れば、作問者がどんな読み間違いを狙っているかが分かります。

今回の例題で、AABCCC に対して並びそうな選択肢を表にしてみました。

選択肢 何を間違えるとこうなるか
A2B1C3 正解
A2B1 ループの後ろの行を読み飛ばし、最後の塊が抜けた
A3B1C3 繰返しを1文字目から始めたと思い込み、最初の文字を二重に数えた
A2B2C4 文字が切り替わったとき count を1に戻す行を見落とした

どの誤りも、処理の中心ではなく端で起きています。最初の1文字、切り替わりの瞬間、最後の1文字の3点を意識するだけで、ほとんどのひっかけは避けられます。

空欄補充では境目の式を疑う

空欄補充の形で出る場合も、狙われるのはやはり境目です。繰返しの開始位置、比べる相手、ループ後の処理のどれかが空欄になっていることがよくあります。

候補の式を1つずつ当てはめるときは、短い文字列で試すのが近道です。今回なら AAB のような3文字程度で十分で、最後の塊が正しく出るかどうかだけ確かめれば判断できます。

実務でも端の処理で不具合が出る

実務でも、文字列を区切ったり詰めたりする処理では、最後の要素の書き忘れがよく起きます。私自身、CSVのような区切り文字の処理で、最終行だけ取り込まれない不具合を出してしまったことがあります。

テストでは、空の文字列、1文字だけの文字列、全部同じ文字の文字列を必ず試すようにしています。試験でも同じ発想で、極端な入力を1つ思い浮かべるだけで、選択肢の正誤がはっきりすることがあります。

配列の添字で迷いやすい人は、同じ考え方で整理した配列問題の記事も役に立つはずです。

【関連記事】科目Bの配列問題の解き方|添字を表にして追う方法

シミュレーターで動かして確かめる

ここまで紙の上で追ってきましたが、最後は実際に動かしてみるのがいちばん確実です。自分の書いたトレース表と、実際の動きが一致するかを確かめられるからです。

Giji Academyの擬似言語シミュレーターでは、擬似言語のコードを1行ずつ動かし、変数の値が変わる様子を見ることができます。今回のように、prev と count と result の3つが同時に動く処理こそ、目で見ると理解が早まります。

入力を変えて解き直す

一度正解できたら、入力の文字列を変えて解き直してみてください。ABC のように全部違う文字、AAAA のように全部同じ文字で試すと、それぞれ A1B1C1 と A4 になるはずです。

さらに、ループの後ろの行を消したらどうなるか、繰返しを1から始めたらどうなるかも試してみましょう。先ほどの選択肢の表と同じ結果が出れば、ひっかけの仕組みまで自分のものになっています。

自分で手を動かして確かめたい人は、Giji Academyの擬似言語シミュレーターから文字列や配列の講座を選んでみてください。読むだけの勉強より、ずっと記憶に残ります。

まとめ

科目Bの文字列問題は、文字列を文字の配列だと考えれば、配列の問題と同じ手順で解けます。1文字ずつ取り出し、何かと比べ、結果をためていく骨組みはどの型でも共通でした。

コードを開いたら、戻り値、繰返しの範囲、ループの後ろの行の順に目を付けます。特にループの後ろに残った処理は、最後の塊を仕上げる大事な役割を持っていることがあります。

トレース表では、文字が切り替わった瞬間に結果が伸びる様子を追いました。選択肢の違いは、最初の1文字、切り替わり、最後の1文字という端の部分に集まっています。

探す型の例でも、途中で return するかどうかという小さな違いが答えを分けていました。型が変わっても、見る場所と追い方は同じです。

最初は時間がかかっても大丈夫です。表を書いて追う経験を重ねるうちに、文字列を見た瞬間にどこが狙われているかが分かるようになります。

擬似言語の基礎から応用まで学べる
Giji Academy

Giji Academyでは、擬似言語の基礎からアーキテクチャなどの応用的な内容まで幅広く学べます。
また、ブラウザ上で直接擬似言語コードを試すことができ、実践的なスキルを身につけることが可能です。

Giji Academy の学習画面。左に教材、右にシミュレーター 擬似言語の学習を始める

擬似言語の学習をここから始めよう。