10年ぶりに基本情報技術者の過去問を解いてみた

基本情報技術者試験の過去問を模試っぽく解いてみたので、過程を実況風に共有します。
想定する読者は、基本情報をこれから受験する方で、他の人が試験中にどういう心の動きをするのか気になっている方です。
クールな解き方を解説することが目的ではないので、ケアレスミスもそのまま取り繕わずに載せます。

ちなみに僕は10年くらい前に基本情報技術者を取った後、応用と高度をいくつか取った者です。
基本情報の、特に午後試験のことはもう何一つ覚えてないです。
試験対策が皆無の状態から、本番のノリだけでやってみたところ、次の結果となりました。

- 午前試験: 開始50分で途中退室、87点
- 午後試験: 時間ギリギリまで粘り、約73点

解く問題は、直近の平成31年度春期試験です。
記事中に問題文の引用はしないので手元で見比べながらお読みください。
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31.html

## 午前試験

という感じで、午前試験から解いていきます。80問もあるんすかこれ…。
午前試験は高度情報の午前2と被ってるところ多いので、覚えてるところが多かったです。
特に書くことも無いので結果だけ載せます。

- 所要時間: 50分
- 間違えた問題: 8, 13, 20, 23, 46, 59, 71, 80
- 正答率 70/80 → 87点。

## 午後試験

【残り150分】

選択問題のどれを解くか決めた時点でわりと合否が決まってる気がします。
今回は次の黒丸が付いてる大問を解きました。

- 必須
  - ● [1] 利用者認証（小問数5）
- 4問選択
  - ○ [2] メモリ（小問数5）
  - ● [3] データベース（小問数6）
  - ○ [4] ネットワーク（小問数5）
  - ● [5] Webシステム？（小問数5）
  - ● [6] プロジェクトマネジメント（小問数8）
  - ● [7] ストラテジスト？（小問数7）
- 必須
  - ● [8] ハフマン符号（小問数6）
- 1問選択
  - ○ [9] C言語（小問数7）
  - ○ [10] COBOL（小問数6）
  - ○ [11] Java（小問数6）
  - ○ [12] アセンブリ（小問数6）
  - ● [13] 表計算（小問数6）

問2〜7からの4問選択。
まず小問数が多い問6と問7は選びます。
小問数が多いということは小問あたりの難易度が低く、もしケアレスミスをしてしまっても配点も低いだろうと思われるからです。
残り2問は、メモリやネットワークはメカメカしくて覚えてないと意味が分からず詰む可能性があるので回避し、問3と問5を選びました。
（結果的に問5が難しかったので選択をミスったかも知れません。）

問9〜13のプログラミングの出題。
COBOLとアセンブリはそもそも知らないので回避します。
C言語とJavaは実務で触ることが多く、基本情報を受けた10年前当時の僕と比べて習熟度が上がってしまっていて、選択すると本記事の目的に合わない気がするのでなるべく避けたいです。
残る選択肢は表計算しかないですが、10年前に受けた時には表計算は知らなくても解けるレベルの難易度だった記憶があるので、これを選びます。
（結果的に表計算は相当難しかったので、選択をミスりました。難化してますね。）

【残り120分、どれ解くか悩んでたら30分経ってた…】

以下、午後試験を解き終わるまで模試中のメモのコピペのため言葉遣いが乱れます。

### [問1] 利用者認証

ネットワークセキュリティ系の出題。これが必須問題なのは近年の事情から納得。
1問目だからか難しくはなく、あまり迷うところは無い。

- (a) カ `→ 正解`
- (b) イ `→ 正解`
- (c) ウ `→ 正解`
- (d) エ `→ 正解`
- (e) エ
  - WebブラウザからIdPへの通信が答えのはず
  - 該当するの4と6なんだけど選択肢に6しかないので多分これ
  - `→ 不正解、図の見方を間違えている`

【残り115分】

### [問3] データベース

SQL穴埋め系はあまり迷うところは無い。

- (a) ア `→ 正解`
- (b) ウ `→ 正解`
- (c) ア `→ 正解`
- (d) ア
  - 「主キー制約」か「UNIQUE制約」で迷う
  - 「主キー制約」ってなんか聞き慣れないので多分「UNIQUE制約」
  - `→ 不正解、「主キー制約」が答え`
- (e) ウ `→ 正解`
- (f) ア
  - 詳細後述
  - `→ 正解`

OUTER JOIN と COUNT の組み合わせとか正直難しいので、たぶん正解しなくても良い問題。
選択肢のなかで COUNT(身長) か COUNT(身長階級) の二択なのはすぐ分かる。
前者は NULL になることがあり、後者は NULL になることがないのが違い。
問題文に「COUNT(*) だと NULL となっているレコードもカウントするのが不具合の原因」みたいなことが書いてあり、後者だと何も状況が変わらないので、前者が答えということになる。
NULL を含む列を COUNT したときの挙動なんて覚えてないけど、状況からしてこれしかない。

【残り105分】

### [問5] Webシステム？

- (a) カ
  - 問題本文の記述「申込者から検査農作物と検索項目を受け付ける」「ただし検査項目は登録しない」を見つければ解ける。こういうのは現国の本文抜き出しに似てる。
  - `→ 正解`
- (b) オ
  - 詳細後述
  - `→ 正解`
- (c) エ
  - 詳細後述
  - `→ 正解`

(b), (c) の考察

選択肢ウの「検査項目名」はよく見れば「検査結果情報テーブル」にすでに登場しているので、他の箇所に出現するはずがなく、明らかに不正解。
ウ以外の選択肢は全て「なんとかID」なので、つまりこれはテーブル間の参照関係を問う問題らしい。

問題文に「1つの検査農作物に5つまで検査項目を設ける」とあるので、 農作物:検査結果 == 1:多 であることが分かり、検査結果のテーブルが農作物のテーブルを参照することになる。
なので(c)はエの「検査農作物ID」。

検査結果は申込者と紐付いている必要があるけど、いま見えている箇所に申込者への参照はない。
なので最後の空欄(b)にオの「申込者ID」を突っ込むしかなく、これが答え。

ここまでで「申込者 1---* 農作物 1---* 検査結果」というDB設計になっていることが分かった。

- (d) イ
  - なんか歯切れ悪いけど画面の構成要素的に「農作物詳細」「申込者詳細」「検査結果」の3回のはず
  - `→ 正解`
- (e) オ
  - 詳細後述
  - `→ 正解`

検査結果を検査日降順に出すというところから、最初に叩くのは listResultInfo ということがわかり、エ,オの二択になる。
エは「申込者→農作物」の順でとり、オは「農作物→申込者」の順で取る。
(b)(c)で答えた内容を思い起こせば、参照の関係上、「検査結果→農作物→申込者」の順でしか取れないので、オが正解。

大問5はかなりムズい気がする。
Web系のゆるふわな問題かと思いきや、自然文からDB設計を抽出する難問だった。

【残り70分、大問5に35分も使ってピンチ】

### [問6] プロジェクトマネジメント

選択問題のなかで一番小問数が多い問題。
PMのガチな出題が基本情報で出るはずがないので、国語力で解けるやつのはず。

- (a) ウ
  - 常識的に考えて、担当PMがプロジェクト管理チームとか開発チームの間を取り持つはず
  - `→ 不正解、僕の常識はズレている`
- (b) イ `→ 正解`
- (c) キ `→ 正解`
- (d) ア `→ 正解`
- (e) ウ
  - 31と32の二択で迷わせに来るの、地味に迷うからやめてほしい
  - 空欄eの次の行に「計画2は36週目までに…」と記述があり、これの1ヶ月前なので32週に決まってる
  - ほぼ国語の問題
  - `→ 正解`
- (f) オ
  - 16週間で19人月
  - `→ 正解`
- (g) エ
  - 20週間で19人月
  - `→ 正解`
- (h) イ `→ 正解`


(e)以降、間違えると後続の問題も連鎖的に間違えるところがあったのでミスるとキツそう。

【残り55分】

### [問7] ストラテジスト？

問題文がなんかこう`[A-Z](製造工場|事業部|システム)`みたいな見た目をしてる。
読んでもメカメカしくて全く頭に入ってこない。 
しょうがないからあんまり読まずに解く。

- (a) ア `→ 正解`
- (b) イ `→ 正解`
- (c) ア `→ 正解`
- (d) ウ `→ 正解`

(a)〜(d)はただ画力を問う問題。
↓こういう絵を余白に書いて、線の本数を数え間違えなければ解ける。

![7_a-d](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235355/71bb23b7-7dee-3099-c1aa-16b2d3e35e5e.jpeg)


- (e) ウ
  - 計算したら 21.6 になったけど、選択肢の一番近い解答は 21.7 しかない
  - 線の本数を数え間違えてるっぽい、選択式なのでとりあえずこれでいいや
  - `→ 正解`
- (f) イ
  - 計算すると6.25のはずだけど、一番近い値が選択肢には6.2しかないので、これ…？
  - 残り時間がやばいのであんまり深く考えないことにする
  - `→ 不正解、派手な計算間違い`
- (g) 空欄
  - （問題の存在を見落としてた）
  - `→ 不正解（笑）`

【残り35分、だいぶ焦ってきてる】

### [問8] ハフマン符号

- (a) ア `→ 正解`
- (b) ア
  - これは計算するだけ
  - `→ 不正解、恥ずかしい`

難解なコーディングの問題がきた…。時間がないのであまり読まずに勘で解くことにする。

- (c) カ
    - ループ中で変わってるの size += 1 だけなのでこれが終了条件のはず
    - `→ 不正解、ループ中の破壊的な関数呼び出しの見落とし`
- (d) エ
    - 問題文の日本語部分を読むと「親が作成されていないこと」を表す条件を突っ込むらしい
    - 該当するのは "parent[i] < 0" か "parent[i] > 0" の二択だけど、上の方の図3に -1 で埋めてる箇所が見えるので前者が正解っぽい
    - `→ 正解`
- (e) オ
    - 再帰呼び出しで parent 側に登っていってるので、ここは「親が存在する」ことを示す条件が入るはず
    - `→ 正解`
- (f) イ
    - 時間が無いからオーラで判断するとイが答え
    - `→ 正解`

【残り20分、もう頭が回ってない】

### [問13] 表計算

パトラッシュ…僕はもう疲れたよ…なんだかとても眠いんだ…
問題文も長くてもはや頭に入ってこないから、出題のとこだけ読むことにする。

- (a) イ
    - イが答えですよね、見れば分かる
    - `→ 不正解`
- (b) イ
    - イ,ウの二択。見るのが「販売額→販売回数」の順らしいのでなんとなくイっぽい
    - `→ 不正解、ウでした`
- (c) ウ
    - これはクーポンの発行条件をそのまま四則演算に落とし込めばウしかない
    - `→ 正解`

残りの問題は表計算マクロ。なにこれめっちゃムズくない？
表計算そもそもよく知らないので、オーラも読めない。
残り5分、完全に選択肢の見た目だけで選ぶことにする。

- (d) オ `→ 正解`
- (e) オ `→ 正解`
- (f) ウ `→ 不正解`

【残り0分、終了！】

## 午後試験ふりかえり

正答率

- 大問1: 4/5
- 大問3: 5/6
- 大問5: 5/5
- 大問6: 7/8
- 大問7: 5/7
- 大問8: 4/6
- 大問13: 3/6

問1〜7: 26/31 → 60*26/31 = 約50点
問8〜13: 7/12 → 40*7/12 = 約23点
合計: 33/43 → 約73点
※実際には小問によって配点は異なるらしく、予想の得点です。

わりと運に救われたところが多かったので（特に問13表計算）、運の振れ幅によっては落ちるレベルなように思います。
問7の後半から明らかにケアレスミスが増えてるのがツライです。MPが切れてきてますね。
試験本番のタイムスケジュールで解くなら、午前試験を途中退室した後にそのへんで昼寝、柔軟体操、魔剤投入などを行ってMPを補充しておく必要がありそうです。

解く問題を決めるのに30分は明らかに時間をかけすぎました。
基本情報技術者は大問によって出題分野が全然違い、どれを解くか事前に決め打っておくことが可能なので、ちゃんと事前準備をしておいて本番ではノータイムで選択問題を選びたいです。
（逆に高度情報だと問題選択にちょっと時間をかけたほうが有利な気がします。）

問2〜7の4問選択。
小問数の多い問6（プロジェクトマネジメント）と問7（ストラテジスト？）を選んだのは良かったと思います。
問5（Webシステム？）はやけに難しく、選ぶべきではありませんでした。
問5は一見するとWeb開発の経験がちょっとあれば解けそうに見えるので、これを選んで点を落とした受験者が多いのではないかな〜という感じです。
ちゃんと解いてないですが問3〜4がデータベース、ネットワークの知識問題らしく、残り2問はここから選ぶのが良い気がします。


問8、アルゴリズム必須問題。
関数の呼び出し先で呼び出し元の値が変わるようなコードがあって、めっちゃややこしかったです。
これは必須問題で避けようが無いので、気合入れるしか無いですね。

問9〜13、アルゴリズム選択問題。
表計算は無理でした。ややこしさにおいてC言語やJavaと比べて何も遜色ないです。
普通にC言語とJavaの問題を見比べて、点が取れそうな方を解く感じが良さげです。

## 以上です

ここまで読んでいただけた方、ありがとうございました。
これから試験を受けられる方は頑張ってください。