基本情報 科目Bのアルゴリズム対策|擬似言語問題を解けるようになる勉強法
アルゴリズムの対策と言われても、結局なにを覚えればいいのか分からない。
参考書のアルゴリズムの章を開いて、そのまま閉じてしまった経験はありませんか?
科目Aは用語を覚えるほど点が伸びました。ところがアルゴリズムは、覚えた気になっても問題が解けるようにならない。その手応えのなさが不安の正体ではないでしょうか。
でも大丈夫です。科目Bで問われるアルゴリズムの範囲は、思っているよりずっと狭いところに収まっています。
私はエンジニアとして10年以上、Webシステムの開発や運用に携わってきました。仕事で新しいアルゴリズムを一から考える場面は、正直に言うとほとんどありません。
やっているのは、すでにある処理の形を見分けて、値の動きを追うことです。科目Bで問われている力も、これとほとんど同じものです。
この記事では、対策すべき範囲を先に絞り込んだうえで、擬似言語の問題が解けるようになるまでの進め方を順番に説明していきます。
科目Bのアルゴリズム対策とは何をすることか¶
はじめに、対策の中身をはっきりさせておきましょう。ここを取り違えたまま勉強を始めると、時間だけが減っていきます。
科目Bは全20問で、そのうちアルゴリズムとプログラミングが16問を占めます。残りの4問が情報セキュリティです。
出題の8割がアルゴリズムということになります。ここを避けたまま合格するのは、現実的ではありません。
ただし、出題されるのは有名なアルゴリズムの名前や仕組みを答える知識問題ではないんです。目の前の擬似言語のコードが何をしているかを読み取れるかどうかが問われます。
科目Bという試験そのものの全体像から確認したい人は、先にこちらを読んでおくと土台が固まります。
【関連記事】基本情報技術者試験の科目Bとは?擬似言語・アルゴリズム対策を初心者向けに解説
知識として覚える量は多くない¶
アルゴリズムと聞くと、有名な手法を片端から暗記する勉強を想像するかもしれません。実際にやることは、それとはかなり違います。
科目Bの問題文には、そのプログラムが何をするものかという説明が必ず添えられています。手法の名前を知らなくても、説明とコードを突き合わせれば意味は取れる作りになっています。
覚えるべきなのは、処理の形と、その形が出てきたときに何を確かめればいいのかという着眼点です。名前を暗記しても、そこは埋まりません。
だから対策の中心は暗記ではなく、読む練習になります。この方針だけ決めておけば、参考書のどこに時間を使うかで迷わなくなります。
難しく感じる本当の理由¶
それでもアルゴリズムの問題が難しく感じるのは、コードそのものではなく、追い方が決まっていないからです。
一行ずつ何をしているかは分かるのに、繰返しを何周かした時点で今どうなっているかを見失う。多くの人がつまずくのはこの一点に集約されます。
これは頭の良し悪しの話ではありません。人間の短期記憶は、変数が3つ4つと増えた時点で普通に溢れます。
だから対策は、記憶力ではなく手順で解決します。値を紙に書き出して外に置いてしまえば、見失いようがなくなるからです。
対策すべきアルゴリズムの範囲を絞る¶
やみくもに手を広げる前に、出題される処理の型を把握しておきましょう。科目Bで繰り返し登場する形は、次の表にまとめた程度です。
| 処理の型 | 見た目の特徴 | 対策で確かめること |
|---|---|---|
| 集計 | 0で初期化した変数に足していく | どこで初期化しているか |
| 探索 | 見つかったら繰返しを抜ける | 見つからなかったときの戻り値 |
| 整列 | 一時変数を挟んで値を入れ替える | 何回目の交換で何が動くか |
| 入れ子の繰返し | forの中にforがある | 内側が何回回るか |
| 再帰 | 自分自身を呼び出す | 呼び出しが止まる条件 |
| データ構造の操作 | 配列や参照をたどる | 位置がずれていないか |
この6つが見分けられれば、初見の問題でも取っ掛かりは必ず見つかります。逆に言えば、ここに無い難解な手法を先に追う必要はありません。
対策の順番としては、上から進めるのがおすすめです。集計と探索は他の型の部品としても出てくるので、先に固めておくと後が軽くなります。
探索と整列は基本形だけ押さえる¶
探索と整列は、科目Bで最も出やすい題材です。ただし、細かい手法を網羅する必要はありません。
探索なら、先頭から順に見ていく線形探索と、範囲を半分に絞る二分探索の2つで十分です。この2つの違いが説明できれば、応用が出ても対応できます。
整列も同じで、値を比べて入れ替えるという核の部分が追えれば形になります。手法ごとの名前より、交換のたびに配列がどう変わるかを目で追えるかが大事です。
探索の読み分けは、こちらの記事で具体的なコードとあわせて確認できます。
【関連記事】擬似言語の線形探索と二分探索の違いとは?科目Bで差がつく探索の読み方
整列のほうは、交換処理でつまずく人がとても多い分野です。手順を追う練習にはこちらが向いています。
【関連記事】擬似言語の整列(ソート)がわからない人へ|選択ソートと交換処理の読み方を解説
データ構造は図にすると急に読める¶
配列より一段難しく感じるのが、リストや木といったデータ構造の問題です。ここは読み方のコツがはっきりしています。
コードを文字のまま追うのではなく、箱と矢印の図に描き直してから追うことです。参照がどこを指しているかは、図にした瞬間に見えるようになります。
実務でも、複雑なデータの持ち方を検討するときはまず図を描きます。頭の中だけで構造を保とうとして良かったことは、これまで一度もありませんでした。
連結リストの問題で参照を見失いがちな人は、たどり方を整理したこちらを参考にしてみてください。
【関連記事】擬似言語のリスト(連結リスト)がわからない人へ|ノードと参照のたどり方を解説
入れ子の繰返しは回数を数える¶
もう1つ、対策で落とせないのが繰返しの中に繰返しがある形です。整列の問題では、ほぼ必ずこの形が出てきます。
ここで見るのは処理の中身ではなく、内側が何回動くかという回数のほうです。外側が1周するあいだに内側が何周するのかを、最初に確かめてください。
回数が分かると、そのプログラムがどれくらいの仕事をしているかも見えてきます。計算量を問う設問は、この回数の数え方がそのまま答えになります。
二重の繰返しで迷子になりやすい人は、読み方を整理したこちらから確認してみましょう。
【関連記事】擬似言語の多重ループ(入れ子の繰返し)がわからない人へ|二重forの読み方を解説
例題で読む順番を確かめる¶
ここからは実際のコードで練習しましょう。配列の中から目的の値を探す、探索の基本形です。
○整数型: 位置を探す(整数型の配列: 数値, 整数型: 目標)
整数型: i
for (i を 1 から 数値の要素数 まで 1 ずつ増やす)
if (数値[i] が 目標 と等しい)
return i
endif
endfor
return -1
短いコードですが、科目Bで問われる要素がひととおり入っています。読む順番を決めて追っていきます。
最初に見るのは宣言と戻り値¶
コードを上から順に読む前に、目を付ける場所があります。1行目の宣言と、最後の行の戻り値です。
1行目からは、配列と目標という2つの値を受け取り、整数型を1つ返すことが分かります。この時点で、答えは数値そのものではなく位置だと見当が付きます。
最後の行では-1を返しています。ここが探索の問題で最もよく問われる部分です。
なぜ-1なのかというと、見つからなかったことを表すためです。位置は1以上の値になるので、あり得ない値を返すことで区別しています。
トレース表で値の動きを追う¶
見当が付いたら、実際に値を入れて確かめます。配列に4と9と2が入っていて、目標が9だとしましょう。
繰返しごとの状態を表にすると、次のようになります。
| 繰返し | i | 数値[i] | 目標と等しいか | 動き |
|---|---|---|---|---|
| 1回目 | 1 | 4 | いいえ | 次へ進む |
| 2回目 | 2 | 9 | はい | 2を返して終了 |
| 3回目 | ― | ― | ― | 実行されない |
3回目が実行されない点に注目してください。returnに到達した時点で、繰返しごと処理が終わります。
この動きが読めていないと、最後まで回ると勘違いして選択肢を誤ります。空欄補充では、まさにここが問われます。
選択肢を絞るときは、境界にあたる値を1つ入れて試すのが確実です。目標が配列の先頭にある場合と、どこにも無い場合の2通りを当てはめれば、たいていの誤答は落とせます。
配列の1番目と要素数の扱いは、実務でも間違えると不具合に直結する場所でした。試験でも同じで、添字が1つずれているだけの選択肢が必ず紛れ込んでいます。
トレース表の書き方そのものに自信がない人は、手順を決めて練習するのが近道です。
【関連記事】擬似言語のトレース表の書き方|科目Bで変数の値を追う手順を解説
紙で追ったあとは、実際に動かして答え合わせをすると理解が定着します。Giji Academy の擬似言語シミュレーターなら、一行ずつ進めながら変数の値が変わる瞬間を画面で追えます。
自分のトレースと画面の値がずれた場所が、そのまま弱点です。そこだけを重点的に潰していけば、対策の効率は一気に上がります。
アルゴリズム対策の進め方¶
範囲と読み方が分かったところで、進め方を決めましょう。次の4段階で組み立てると、今どこにいるのかが分かりやすくなります。
| 段階 | やること | 次へ進む目安 |
|---|---|---|
| 1 | 記号と繰返しの書き方に慣れる | 短いコードの流れを言葉で説明できる |
| 2 | 集計と探索をトレースで追う | 表を書けば答えを出せる |
| 3 | 整列・データ構造・再帰に広げる | 図を描いて処理を追える |
| 4 | 時間を測って通しで解く | 1問あたりの時間が安定する |
期間ではなく、目安の欄が満たせたかどうかで判断してください。進む速さは人によって違って当たり前です。
段階3まで来ると、初見の問題でも慌てなくなります。知らない処理でも、型のどれかに当てはめて読み始められるからです。
再帰は最後に回してかまいません。呼び出しが戻ってくる動きは慣れが必要なので、他の型が固まってからのほうが理解が早くなります。
再帰でつまずいたときは、処理を追うコツを整理したこちらが助けになります。
【関連記事】基本情報科目Bの再帰呼び出しがわからない人への対策方法を解説|擬似言語で処理を追うコツ
よくある遠回りを3つ¶
真面目に取り組んでいる人ほどはまりやすい落とし穴があります。私がよく見てきたものを挙げておきます。
1つ目は、解説を読んで分かった気になることです。解説を閉じた状態で自力でトレースできなければ、その問題はまだ解けていません。
2つ目は、有名アルゴリズムの仕組みを調べ続けてしまうことです。仕組みの理解は無駄ではありませんが、それだけでは擬似言語のコードは読めるようになりません。
3つ目は、難しい問題ばかり選ぶことです。基本の型が入っている標準的な問題を確実に取るほうが、合格には直結します。
心当たりがあれば、明日の勉強から1つだけ直してみてください。全部を一度に変えようとしないほうが続きます。
科目B全体の勉強の順番から見直したい人は、あわせてこちらもどうぞ。
【関連記事】基本情報技術者試験 科目Bの勉強法|初心者が合格までにやることを順番に解説
まとめ¶
最後に要点を振り返ります。
科目Bのアルゴリズム対策は、手法を暗記することではありませんでした。出題される処理の型を見分け、値の動きを追えるようにすることが中心になります。
範囲は集計、探索、整列、入れ子の繰返し、再帰、データ構造の操作におおむね収まります。上から順に固めていけば、後の型ほど楽に読めるようになるはずです。
追うときは必ず手を動かしてください。トレース表を書く手間を惜しまなかった人から、順に読めるようになっていきます。
進め方は、記号に慣れる、集計と探索を追う、範囲を広げる、時間を測るという4段階でした。前の段階を飛ばさないことが、結局はいちばんの近道になります。
読める瞬間は、ある日わりと突然やってきます。積み上げてきた読み方が、そこでつながるからです。今日はまず、短い探索のコードを1つ選んで表に起こすところから始めてみましょう。