科目Bの配列問題の解き方|添字を表にして追う方法
配列の問題になると、何番目を見ているのか途中で分からなくなる。
科目Bの配列問題を、頭の中だけで数えようとしていませんか?
一つずつは分かるのに、3周目あたりで自分がどこを見ているか怪しくなる。そして最後に出た答えが、選択肢に無い。
この崩れ方をする人はとても多いです。理由は単純で、添字は目で追える情報量を超えるからです。
私はエンジニアとして10年以上、Webシステムの開発や運用に携わってきました。実務でも、配列の位置を一つ間違えただけで表示がずれる不具合は珍しくありません。
その調査でやることは、頭で数え直すことではなく、値と位置を紙に並べることです。科目Bの配列問題も、同じやり方でそのまま解けます。
この記事では例題を1本だけ使って、添字を表に落として追う手順を最初から最後まで実演します。
科目Bで配列の問題はどんな形で出るのか¶
まず、どんな聞かれ方をするのかを整理しておきましょう。ここが分かると、コードを読む前に狙いが定まります。
配列がからむ設問は、答えの単位でだいたい4つに分かれます。
| 問われ方 | よく出る処理 | 答えの単位 |
|---|---|---|
| 何番目かを答える | 探索、条件に合う最初の要素 | 位置(添字) |
| いくつあるかを答える | 集計、条件に合う要素の数 | 個数 |
| いくつになるかを答える | 合計、最大値、平均 | 値 |
| 中身がどうなるかを答える | 並べ替え、挿入、削除 | 配列全体 |
この4つは見た目が似ています。同じようなforとifが並ぶので、コードだけを見て区別しようとすると混ざります。
実際、位置を返す処理と個数を返す処理は、変数名を伏せると見分けが付かないことすらあります。違いはreturnの行に集約されているだけです。
だから区別するのは設問文の側です。科目Bの全体像から確認しておきたい人は、先にこちらを読むと土台が固まります。
【関連記事】基本情報技術者試験の科目Bとは?擬似言語・アルゴリズム対策を初心者向けに解説
配列そのものの文法に不安があるなら先に戻る¶
添字が1から始まるのか0から始まるのか、要素数と最後の添字は同じなのか。ここが曖昧なままだと、この記事の手順を使っても答えがずれます。
文法の側に不安が残っている段階なら、先に確認しておくほうが早いです。
【関連記事】擬似言語の配列と添字がわからない人へ|要素数・二次元配列の読み方を解説
段1:設問が聞いているのは位置か個数か値か¶
最初にやるのはコードを読むことではありません。答えの単位を確定させることです。
位置を聞かれているのに個数を数えていたら、途中の計算が全部合っていても外れます。逆に単位さえ決まっていれば、コードのどこを見ればいいかがほぼ決まります。
設問文を先に読んでから、コードに戻る¶
問題は、説明文、擬似言語のコード、設問文という並びで載っていることが多いです。上から順に読む必要はありません。
設問文まで飛ばして読み、答えの単位を決めてからコードに戻ってください。何を探すか分かった状態で読むと、目に入る行の数がぐっと減ります。
答えの単位は、問題用紙の余白に一言だけ書いておくのがおすすめです。位置、個数、といった短い言葉で構いません。
追っている途中で目的を見失っても、そのメモを見れば戻ってこられます。数秒の手間で読み直しを一度防げるなら、十分に元は取れます。
配列の中身は問題文から先に写しておく¶
設問に具体的な値が書いてあるときは、コードを読む前に配列の中身を余白へ写してください。順番も含めてそのまま書き写します。
このひと手間で、値を見間違えたまま最後まで走る事故が減ります。問題文とコードを何度も往復する時間も削れます。
写すときは、上に添字、下に値という2段の形にするのがおすすめです。何番目に何が入っているかが、ひと目で分かるようになります。
段2:配列のコードはこの3か所から見る¶
答えの単位が決まったら、コードに移ります。ここでも上から順には読みません。
ここからは例題を使います。試験でよく見る形に寄せて、私が書いたものです。
○整数型: 最長連続(整数型の配列: 点数, 整数型: 境界)
整数型: i, 連続, 最長
連続 ← 0
最長 ← 0
for (i を 1 から 点数の要素数 まで 1 ずつ増やす)
if (点数[i] ≧ 境界)
連続 ← 連続 + 1
if (連続 > 最長)
最長 ← 連続
endif
else
連続 ← 0
endif
endfor
return 最長
境界以上の点数が何回続いたか、その最長の回数を返す処理です。設問は、点数が70、85、90、40、95、88で境界が80のとき、返される値はいくつか、としましょう。
このコードで先に見る場所は3か所だけです。順番も決まっています。
| 順番 | 見る場所 | そこで分かること |
|---|---|---|
| 1 | forの始まりと終わり | 添字が何番から何番まで動くか |
| 2 | 角かっこの中身 | どの要素を見ているか |
| 3 | 添字が式になっている行 | はみ出す危険があるか |
この3か所を押さえると、コード全体を丁寧に読む前に追うべき値が決まります。順に見ていきます。
添字の始まりと終わりを先に押さえる¶
forの行を見ると、iは1から点数の要素数まで動きます。今回は要素が6つなので、iは1から6です。
擬似言語の配列は1から数えるのが基本です。0から数える言語に慣れている人ほど、ここで一つずれます。
そして終わりの側も確かめてください。要素数までなのか、要素数マイナス1までなのかで、最後の1周が変わります。
隣どうしを比べる処理では、終わりが要素数マイナス1になっていることがよくあります。理由は簡単で、最後の要素には隣が無いからです。
角かっこの中身が式になっている行に印を付ける¶
2か所目は角かっこの中です。今回は点数[i]だけなので素直ですが、試験ではここが式になることがあります。
点数[i + 1]や点数[要素数 - i + 1]のような書き方が出たら、その行に印を付けてください。添字がずれる事故は、ほぼこの形の行で起きます。
印を付けたら、iが最初の値のときと最後の値のときの2回だけ、その式に代入して確かめます。全部の周を確かめる必要はありません。
両端さえ配列の範囲に収まっていれば、途中は安全です。この2回のチェックで、はみ出しの見落としはほとんど防げます。
要素をずらす処理が出てくる問題では、この確認がそのまま得点になります。挿入や削除の形に慣れておきたい人はこちらもどうぞ。
【関連記事】擬似言語の配列への挿入と削除がわからない人へ|要素をずらす処理の読み方を解説
段3:添字を表にして追う¶
見る場所が決まったので、いよいよ値を入れます。この段のルールは一つだけで、頭の中で数えないことです。
表にする列は、段2で見た時点でもう決まっています。今回ならi、点数[i]、連続、最長の4列です。
点数が70、85、90、40、95、88で境界が80のとき、1周ごとの状態は次のようになります。
| i | 点数[i] | 境界以上か | 連続 | 最長 |
|---|---|---|---|---|
| 1 | 70 | いいえ | 0 | 0 |
| 2 | 85 | はい | 1 | 1 |
| 3 | 90 | はい | 2 | 2 |
| 4 | 40 | いいえ | 0 | 2 |
| 5 | 95 | はい | 1 | 2 |
| 6 | 88 | はい | 2 | 2 |
答えは2です。後半にも連続はありますが、長さが2どまりなので最長は更新されません。
この表で大事なのは、4行目です。40のところで連続が0に戻り、それまでの記録が最長に残っている。
配列の問題は、この戻す行を見落とすかどうかで答えが割れます。表に書いてあれば、見落としようがありません。
添字の列と値の列は必ず分けて書く¶
トレース表がうまく書けない人の多くは、点数[i]の値だけを書いています。それだと今どこを見ているのかが表から消えます。
iの列と点数[i]の列は必ず分けてください。答えが位置なのか値なのかを確かめるとき、この2列があるかどうかで速さが変わります。
判定結果の列も残しておきましょう。あとで選択肢を確かめるとき、どの周で流れが変わったのかを見返せるのが効いてきます。
表の書き方そのものを固めたい人は、手順を分解したこちらから練習するのが近道です。
【関連記事】擬似言語のトレース表の書き方|科目Bで変数の値を追う手順を解説
全部の周を書かなくていい場面もある¶
要素が20個ある配列を20行書いていたら、時間が足りません。本番では途中で切り上げる判断も必要です。
3周ほど書いて動きの規則が見えたら、そこから先は規則で飛ばして構いません。ただし最後の1周だけは必ず書いてください。
答えがずれるのは、たいてい最後の1周です。ここを飛ばすと、せっかくの表が効かなくなります。
段4:間違いやすい選択肢を見分ける¶
答えが出たら、そのまま選ばずに一度止まります。配列の問題は、近い値の選択肢が必ず並んでいるからです。
出題する側は、途中でつまずいた人がたどり着く値を選択肢にしています。今回のコードで作れる誤答を表にまとめました。
| 誤答 | どこで生まれるか | 見分け方 |
|---|---|---|
| 4 | 連続を0に戻す行を見落とした | elseの中の代入を指で押さえる |
| 3 | 最長になった区間の終わりの位置を答えた | 答えの単位が個数か位置かを確かめる |
| 6 | 要素数をそのまま答えた | forの回数と答えは別物だと確認する |
| 90 | 個数ではなく要素の値を答えた | returnが返している変数を読み直す |
この4つで、配列問題の誤答のかなりの部分が説明できます。答えを出したあと、右の列を上から当てはめるだけでも精度が上がります。
とくに1行目の見落としは頻出です。連続を0に戻す行が無いものとして数えると、境界以上の要素の個数がそのまま出てきます。
空欄補充の型なら選択肢をコードに入れて試す¶
配列問題は、処理の一部が空欄になっている型でもよく出ます。この型では、答えを自分で作らなくても構いません。
残った選択肢を空欄に入れて、1周か2周だけ動かしてみてください。全部の選択肢を試す必要はありません。
選ぶのは、動きの境目になる周です。今回のコードなら、連続が切れる4周目に入れて試すのが一番よく効きます。
その1回で、連続を戻す選択肢と戻さない選択肢がはっきり分かれます。時間が押しているときほど、この確かめ方が頼りになります。
読む順番そのものをもう一度確認したい人は、こちらで全体の流れをつかめます。
【関連記事】科目Bの擬似言語問題の解き方|コードを読む順番を例題で解説
段5:シミュレーターで動かして答え合わせをする¶
最後の段は、本番ではなく勉強中にやることです。ここを入れるかどうかで、伸び方がはっきり変わります。
自分の書いた表と、実際にコードを動かした結果を突き合わせてください。合っていれば、その読み方は固まったと考えていいです。
Giji Academy の擬似言語シミュレーターなら、一行ずつ進めながら添字と変数が変わる瞬間を画面で追えます。紙の表と画面の値がずれた行が、そのままあなたの弱点です。
ずれる場所には癖があります。ループの最後の1周だったり、値を戻す行だったり、人によってほぼ決まっています。
その1か所を潰すだけで、同じ型の問題がまとめて解けるようになります。問題数を増やすより、ずっと効率がいいはずです。
動かすときは、配列の中身を自分で変えてみるのも効きます。境界以上の点数を1つも入れない配列にすれば、最長が0のまま返る道を目で確かめられます。
答え合わせでは、正解したかどうかより、どの行でずれたかを記録してください。数週間ためると、自分が繰り返し間違える場所がはっきり見えてきます。
私が現場で新人のコードを見るときも、同じことをしています。どこを間違えたかより、どんな間違え方をする人なのかが分かるほうが、次の一手を決めやすいからです。
まとめ¶
最後に、配列問題を解く順番を振り返っておきます。
始まりは設問文です。答えの単位が位置なのか個数なのか値なのかを決めてから、コードに移ります。
コードで先に見るのは、forの始まりと終わり、角かっこの中身、添字が式になっている行の3か所です。この時点で追うべき値は決まっています。
そのうえで表を書きます。iの列と点数[i]の列を分け、値を戻す行と最後の1周だけは必ず書き残してください。
答えが出たら、個数と位置の取り違えや、戻す行の見落としを当てはめて確かめます。そして勉強中は、動かして答え合わせをするところまでを1セットにしましょう。
添字は目で追うものではなく、書いて追うものです。今日はまず1問だけ、iの列を分けて書く練習から始めてみてください。