基本情報 科目Bの問題はどう解く?問題文から答えを出すまでの手順
問題文を読み終えた時点で、もう何を聞かれているのか分からなくなっている。
科目Bの問題を開いて、上から順に読み始めていませんか?
コードの一行ずつは理解できるのに、最後まで読んだところで手が止まる。そして時間が気になって、もう一度先頭から読み直してしまう。
この読み直しが起きている限り、時間はいくらあっても足りません。ただ、原因は読解力ではないんです。
読む順番が決まっていないだけです。逆に言えば、順番さえ決めてしまえば、同じ問題がずいぶん静かに見えてきます。
私はエンジニアとして10年以上、Webシステムの開発や運用に携わってきました。他人が書いたコードを読む場面は日常的にありますが、そのとき最初から順番に読むことはまずありません。
先に「何を確かめたいのか」を決めて、必要な場所だけを見にいきます。科目Bの問題も、まったく同じ読み方で解けます。
この記事では、問題文を開いてから答えを選ぶまでを5つの手順に分け、順番に説明していきます。
科目Bの問題を解く手順は5段階に分けられる¶
はじめに、これから説明する流れの全体像を置いておきます。どの問題でも、この順番は変わりません。
| 手順 | やること | ここで決まること |
|---|---|---|
| 1 | 設問文を読んで聞かれていることを確定させる | 答えの形 |
| 2 | 宣言と戻り値に目を付ける | 登場する値と最終的な出力 |
| 3 | トレース表で値の動きを追う | 実際の答え |
| 4 | 残った選択肢を見分ける | 誤答の切り落とし |
| 5 | 動かして答え合わせをする | 次に潰す弱点 |
大事なのは、手順1と2を終えるまでコードを丁寧に読まないことです。多くの人は、ここを飛ばしていきなり3から入っています。
科目Bは全20問を100分で解く試験です。単純に割ると1問あたり5分になりますが、この5分の中に読み直しの時間は入っていません。
だからこそ、最初の1分の使い方で残りが決まります。順番に見ていきましょう。
そもそも科目Bがどういう試験なのかを整理しておきたい人は、先にこちらを読んでおくと土台が固まります。
【関連記事】基本情報技術者試験の科目Bとは?擬似言語・アルゴリズム対策を初心者向けに解説
手順1:この設問は何を聞いているのかを確定させる¶
最初にやるのは、コードを読むことではありません。設問文を読んで、答えの形を決めることです。
答えの形とは、数値なのか、位置なのか、それとも空欄に入るコードの断片なのか、という区別のことです。ここが決まっていないと、正しく追えていても選択肢を選べません。
設問文はコードより先に読む¶
問題冊子の構成は、プログラムの説明、擬似言語のコード、設問文、選択肢という並びになっていることが多いです。並びの順に読む必要はありません。
先に設問文まで目を通してから、コードに戻ってください。何を聞かれているかを知った状態で読むと、見るべき行が最初から絞れます。
たとえば「変数xの値はいくつか」と聞かれているなら、追うべきはxだけです。他の変数がどう動いても、答えには関係しません。
実務でも、不具合を調べるときにログを全部読むことはしません。知りたい値が通る場所だけを見にいきます。試験でも同じ節約ができます。
設問文を読んだら、答えの形を問題用紙の余白に一言だけ書いておくのもおすすめです。個数、位置、といった短いメモで構いません。
追っている途中で目的を見失っても、そのメモを見れば戻ってこられます。ほんの数秒の手間ですが、読み直しを一度防ぐだけで十分に元が取れます。
空欄補充か、実行結果かで読み方が変わる¶
科目Bの設問は、大きく2つの型に分かれます。この型によって手の動かし方が変わります。
空欄に入るコードを選ぶ型では、選択肢そのものがヒントになります。4つの選択肢を見比べれば、その空欄で何を判断させたいのかが逆算できるからです。
一方、実行結果や最終的な変数の値を答える型では、選択肢を先に見ても意味がありません。素直に値を追うしかない代わりに、追い切れば必ず正解にたどり着きます。
空欄補充の型で迷いやすい人は、判断のポイントを整理したこちらが参考になります。
【関連記事】基本情報技術者試験の科目Bの空欄補充問題の解き方を解説|擬似言語で見る判断ポイント
手順2:まず目を付ける場所を決める¶
聞かれていることが分かったら、コードに移ります。ここでも上から順には読みません。
例として、次のコードを使って説明していきます。配列の中に、基準以上の値がいくつあるかを数える処理です。
○整数型: 基準以上の個数(整数型の配列: 点数, 整数型: 基準)
整数型: i, 件数
件数 ← 0
for (i を 1 から 点数の要素数 まで 1 ずつ増やす)
if (点数[i] ≧ 基準)
件数 ← 件数 + 1
endif
endfor
return 件数
10行に満たないコードですが、科目Bで問われる要素はひととおり入っています。目を付ける場所は2つです。
宣言を見れば登場人物が分かる¶
1行目と2行目が宣言です。ここだけで、この処理に出てくる値がすべて分かります。
受け取るのは点数という配列と、基準という整数の2つ。内部で使うのはiと件数の2つです。
つまり、追いかける必要がある値は多くても4つしかありません。この数を先に把握しておくと、トレース表に何列必要かが即座に決まります。
宣言の型も見落とさないでください。整数型と書いてあれば小数は出てこないと分かり、割り算の設問で余りの扱いを迷わずに済みます。
戻り値の行で答えの形が決まる¶
もう1つ目を付けるのは、最後のreturnの行です。ここが答えの形を教えてくれます。
このコードは件数を返しています。だから答えは個数であって、位置でも値そのものでもありません。
もし返しているのがiなら答えは位置、点数[i]なら値そのものです。同じような処理でも、返す変数が違えば正解はまるごと変わります。
ここは選択肢を作る側にとって、最も差を付けやすい場所でもあります。実際、位置と値を取り違えさせる選択肢は繰り返し登場します。
返り値がない手続の問題もありますが、その場合は書き換えられる配列や変数が答えの置き場所になります。どこに結果が残るのかを、コードを追う前に決めておいてください。
手順3:トレース表で値の動きを追う¶
読む場所が決まったら、いよいよ値を入れて動かします。頭の中でやらないことが、この手順の唯一のルールです。
点数に70、45、88、60の4つが入っていて、基準が60だとしましょう。繰返しごとの状態を表にすると、次のようになります。
| 繰返し | i | 点数[i] | 基準以上か | 件数(処理後) |
|---|---|---|---|---|
| 1回目 | 1 | 70 | はい | 1 |
| 2回目 | 2 | 45 | いいえ | 1 |
| 3回目 | 3 | 88 | はい | 2 |
| 4回目 | 4 | 60 | はい | 3 |
繰返しを抜けた時点で件数は3です。返される値も3になります。
注目してほしいのは4回目です。60は基準とちょうど同じ値ですが、条件が以上なので数えられています。
ここが不等号の設問で狙われる場所です。もし条件が基準より大きいという形なら、答えは2に変わります。
表を1行ずつ埋めていくと、こうした境目が自然に目に入ってきます。頭の中だけで数えていたら、60を数えたかどうかは記憶の問題になってしまいます。
もう1つ、件数を0に戻している行が繰返しの外にあることも確かめておいてください。この行が繰返しの中にあると、件数は毎周0に戻って答えが1になります。
表の列は書き始める前に決める¶
トレース表がうまく書けない人の多くは、書きながら列を増やしています。それだと途中で表が崩れます。
手順2で宣言を見たときに、列はもう決まっているはずです。今回ならiと点数[i]と件数の3列、それに判定の結果を足せば十分です。
判定結果の列は省きたくなりますが、残しておいてください。あとで選択肢を確かめるとき、どこで数えたかを見返せるのが効いてきます。
表の書き方そのものを固めたい人は、手順を分解したこちらから練習するのが近道です。
【関連記事】擬似言語のトレース表の書き方|科目Bで変数の値を追う手順を解説
途中で迷子になったら戻らずやり直す¶
追っている最中に、今どの周回にいるのか分からなくなることがあります。そのとき前の行を読み直すのは、あまり良い手ではありません。
崩れた表を直そうとすると、間違った値をそのまま引きずってしまいます。1周目から書き直したほうが、結果的に速いです。
私も実務でデータの流れを追うとき、途中でつじつまが合わなくなったらメモを捨てて最初から取り直します。中途半端に直した記録ほど、あとで判断を誤らせるものはありません。
手順4:間違いやすい選択肢を見分ける¶
答えが出たら、そのまま選んで終わりにはしません。近い値の選択肢が必ず並んでいるからです。
出題側は、途中でつまずいた人がたどり着く値を選択肢にしています。よくある型を表にまとめました。
| 誤答の型 | どこで生まれるか | 見分け方 |
|---|---|---|
| 1つずれた値 | 添字の開始や繰返しの終わりを1つ間違える | 最初と最後の周回だけ確認する |
| 不等号違いの値 | 以上と超えるを取り違える | 基準とちょうど同じ値を入れてみる |
| 初期化前の値 | 初期化の位置を読み違える | 0に戻す行が繰返しの内か外かを見る |
| 位置と値の取り違え | 戻り値の変数を見ていない | returnの行をもう一度読む |
| 途中で止まった値 | 繰返しを抜けるタイミングの誤り | 抜ける条件の行を指で押さえる |
この5つで、科目Bの誤答のかなりの部分が説明できます。答えを出したあと、表の右の列を上から順に当てはめるだけでも精度が上がります。
とくに1つずれた値には注意してください。擬似言語の配列は1から数えるのが基本で、0から数える言語に慣れているほど引っかかります。
選択肢を逆に代入して確かめる¶
空欄補充の問題では、もう1つ使える手があります。残った選択肢を空欄に入れて、コードを動かしてみることです。
全部を試す必要はありません。境目にあたる値を1つ決めて、その1回だけ通せば十分に見分けが付きます。
今回のコードなら、基準とちょうど同じ60を含む配列で試すのが効きます。以上と超えるのどちらが入るかは、この1回で決まります。
時間がないときほど、この確かめを省きたくなるものです。ただ、迷ったまま選んだ1問より、確かめて決めた1問のほうが最終的な点数は安定します。
添字の数え方に不安が残る人は、こちらで確認しておくと安心です。
【関連記事】擬似言語の配列と添字がわからない人へ|要素数・二次元配列の読み方を解説
手順5:動かして答え合わせをする¶
最後の手順は、試験当日ではなく勉強中にやることです。ここを入れるかどうかで、伸び方がはっきり変わります。
自分が書いたトレース表と、実際にコードを動かした結果を突き合わせてください。合っていれば読み方が固まった証拠になります。
Giji Academy の擬似言語シミュレーターなら、一行ずつ進めながら変数の値が変わる瞬間を画面で追えます。紙の表と画面の値がずれた行が、そのままあなたの弱点です。
ずれる場所には癖があります。繰返しの最後の1周だったり、条件式の境目だったり、人によってほぼ決まっています。
その1か所を潰すだけで、同じ型の問題がまとめて解けるようになります。闇雲に問題数を増やすより、ずっと効率がいいはずです。
答え合わせのときは、正解したかどうかよりも、どの行でずれたかを記録しておくと役に立ちます。数週間分ためると、自分が繰り返し間違える場所がはっきり見えてきます。
解ける問題の型を広げていく段階に入ったら、対策の範囲を整理したこちらもあわせてどうぞ。
【関連記事】基本情報 科目Bのアルゴリズム対策|擬似言語問題を解けるようになる勉強法
まとめ¶
最後に、5つの手順を振り返っておきます。
科目Bの問題は、設問文を読んで答えの形を決めるところから始まります。ここを飛ばすと、正しく追えていても選べません。
次に見るのは宣言と戻り値の2か所でした。登場する値の数と、最終的に何を返すのかが、この2行で分かります。
そのうえでトレース表を書きます。列は書き始める前に決めて、崩れたら直さずに書き直すのが結局は速い道です。
答えが出たら、1つずれた値や不等号違いの選択肢を当てはめて確かめます。そして勉強中は、動かして答え合わせをするところまでを1セットにしてください。
この順番は、慣れれば意識しなくても手が動くようになります。そうなったとき、同じ問題が前より短く感じられるはずです。今日はまず1問だけ、設問文から読む練習をしてみましょう。