科目Bは「読む」より「追う」試験
基本情報技術者の科目Bと聞くと、長いプログラムをじっと読んで頭の中で答えを出す試験だと思われがちです。でも実際にやるべきことはもっと単純で、地味です。配列の中身と変数の値を、紙の上(あるいは問題用紙の余白)に書き出しながら、コードの指示通りに1行ずつ手を動かしてなぞる。それだけです。読むのではなく、手で追う。この感覚を持っているかどうかで、科目Bの得点は大きく変わります。
当サイトには科目Bの問題を200問収録しています。内訳はデータ構造及びアルゴリズムが90問、プログラムの基本要素が70問、情報セキュリティが40問です。配列のトレース問題が27問と圧倒的に多く、次いで累積配列を読み解くタイプが15問、文字列処理が9問、二次元配列が8問、整列(ソート)が7問、ビット処理が7問、スタックが6問、探索が6問と続きます。数字を眺めるだけでもわかる通り、科目Bの主戦場は「配列を順番にたどる」処理です。逆に言えば、トレースの型を体に染み込ませてしまえば、出題の半分近くをカバーできる計算になります。
実際の問題を、一緒にトレースしてみよう
百聞は一見にしかず、ということで、当サイト収録の実問題を使って実演してみます。問題はこうです。
整数型の配列 a ← {7, 12, 17, 5, 10}、整数型 s ← 1。i を1から配列の要素数(5)まで1ずつ増やしながら、次の処理を繰り返します。「(a[i] + i) mod 3 が0と等しいなら、s ← s + a[i] - i」「そうでなければ、s ← s - (a[i] mod 2)」。最後に return s で値を返します。選択肢はア.6、イ.3、ウ.9、エ.5の4つ。さて、戻り値は何になるでしょうか。
ここで絶対にやってはいけないのが、頭の中だけで計算しようとすることです。iが5まであるということは、判定と更新が5回発生するということ。1回の見落としや符号ミスが、最後の答えを根本から狂わせます。だからこそ表を作って、1行ずつ機械的に埋めていくのが正解です。実際に埋めてみましょう。
| i | a[i] | (a[i]+i) mod 3 | 条件 | 更新式 | s(更新後) |
|---|---|---|---|---|---|
| 1 | 7 | (7+1)=8 → 2 | 偽 | s ← 1 − (7 mod 2) = 1 − 1 | 0 |
| 2 | 12 | (12+2)=14 → 2 | 偽 | s ← 0 − (12 mod 2) = 0 − 0 | 0 |
| 3 | 17 | (17+3)=20 → 2 | 偽 | s ← 0 − (17 mod 2) = 0 − 1 | −1 |
| 4 | 5 | (5+4)=9 → 0 | 真 | s ← −1 + 5 − 4 | 0 |
| 5 | 10 | (10+5)=15 → 0 | 真 | s ← 0 + 10 − 5 | 5 |
表が埋まり終わったところで、return sの値、つまり最終的なsを見ると5になっています。正解はエです。条件が真になるのはi=4とi=5の2回だけで、それ以外の3回は「sから剰余を引く」という、まったく別の式が走っている点に注目してください。ここを取り違えて全部の回で同じ更新式を使ってしまうと、ア・イ・ウのどれかに引きずられてしまいます。実はこの問題、判定式が「a[i] mod 3」ではなく「(a[i] + i) mod 3」になっているところがいちばんの仕掛けです。添字のiを足し忘れて計算すると、真偽の判定そのものがズレて、まったく違う値にたどり着いてしまいます。トレース表のいちばん左の列にiを置き、毎回a[i]だけでなくiも一緒に拾う癖をつけておくと、この種のひっかけにはまりにくくなります。
表に何を書くかで、ミスの起きやすさが変わる
先ほどの表には、あえて「(a[i]+i) mod 3」の計算過程と「条件」の真偽を独立した列にしました。これには理由があります。多くの受験者が事故るのは、計算と判定と更新を頭の中で同時にやろうとしたときです。一つの列にまとめて書こうとすると、途中の暗算が信頼できなくなり、見直しもしづらくなります。逆に、計算→判定→更新→結果の4段階に列を分けて書くと、どこで間違えたかが一目でわかるようになります。
累積配列を読み解く問題(当サイトで15問)でも考え方は同じです。配列の要素を先頭から順に足し込んでいく処理なら、「今回足す値」と「足したあとの累積値」を別の列に分けて書くだけで、検算が一気に楽になります。二次元配列(8問)が絡む場合は、行と列のどちらを先に動かすループなのかを表の見出しに明記しておくと、添字の取り違えを防げます。共通しているのは、コードが何をしているかを「読んで理解した気になる」のではなく、「実際に手を動かして数値を再現する」という姿勢です。
整列・探索・ビット処理・スタックも、結局はトレース
整列(7問)や探索(6問)、スタック(6問)、ビット処理(7問)といったテーマは、一見すると配列トレースとは別物の知識問題に見えるかもしれません。ですが実際に解いてみると、求められているのはやはり「処理を1ステップずつ追って、状態の変化を記録する」作業です。整列ならどの要素とどの要素を比較・交換したか、スタックならpushとpopでどんな値が積まれて取り出されたか、ビット処理なら論理演算のたびにビット列がどう変わるか。これらはすべて、配列トレースで鍛えた「表に書き出して追う」姿勢がそのまま生きてくる分野です。逆に言えば、ビット処理だけ別の対策本を探す必要はありません。トレースの型を一つ身につければ、応用が利きます。
情報セキュリティの40問は、暗記の比重がやや高い
科目Bの中で異色なのが情報セキュリティの40問です。こちらはコードを追うアルゴリズム系とは毛色が違い、用語の正確な理解と、脅威・対策の組み合わせを問う設問が中心になります。とはいえ完全に独立した分野というわけでもありません。設問の中には、認証処理やアクセス制御の流れを擬似言語で示し、その手順のどこに不備があるかを問うタイプもあります。こうした問題では、やはりトレースの考え方が役立ちます。手順を一つずつ追いながら、「この時点で何が起きているか」を確認していく作業は、アルゴリズム問題と地続きだからです。
学習の順番をどう組むか
当サイトのデータから見えてくる優先順位は、はっきりしています。まず配列トレース27問と累積配列15問で「表を作って手で追う」型を固める。これだけで90問あるアルゴリズム分野のかなりの部分をカバーできます。次に文字列処理・二次元配列・整列・ビット処理・スタック・探索といった残りのテーマに進み、それぞれの処理特有の「何を列にするか」を体で覚えていく。最後に情報セキュリティ40問を、用語の正確な暗記と簡単な手順トレースの両面から仕上げる。この順番なら、出題数の多いところから着実に得点源を増やしていけます。
科目Bは才能やひらめきで解く試験ではありません。むしろ逆で、誰でも同じ手順を踏めば同じ答えにたどり着ける、再現性の高い試験です。今日紹介した表の作り方を一度自分の手で再現してみてください。次に似た構造の問題に出会ったときには、迷う時間がぐっと短くなっているはずです。