基本情報技術者試験アルゴリズムは誰でも解ける!解き方解説します!

最近アルゴリズム問題を過去8回分ほど解いてみました!そこでアルゴリズム問題について感じたことや実践した解き方をこのページでは説明したいと思います。

アルゴリズム問題は誰でも解ける

まず最初に言っておきます。

アルゴリズム問題を解く上で最大の敵、それは…

アルゴリズム問題への苦手意識!

です。

最初はほとんどの人が苦手

アルゴリズムの問題文見て「何言ってるか分からない…」「問題文長すぎ…」という印象を持つ方は多いと思います。私もアルゴリズム問題の解説ページを作ったりしていますが、そんな私でも最初はそうでした。多分誰でもそうです。みんな最初はアルゴリズム問題に苦手意識を持つと思います。

アルゴリズム問題に苦手意識を持つ様子

最初に苦手意識を持つと、そのあと問題文を読むときに集中力がなくなり、さらに問題が難しく感じてしまいます。まさに悪循環…。

ですので、まずアルゴリズム問題を解くためには、アルゴリズム問題は難しい!苦手!というそのイメージを払拭していただきたいです。このページの目的はこのアルゴリズム問題が難しいというイメージの払拭です。

アルゴリズム問題に必要な力

私がアルゴリズム問題は誰でも解けると思っている理由はココです。アルゴリズム問題は時間さえかければ誰でも解ける問題です。

アルゴリズム問題に必要な力は

  • 読解力:問題を読んで理解する
  • 論理的思考能力:論理的に考えて答えを導く
  • 忍耐力:最後まで解き抜く

の3つです。ただし別に3つの力が抜きん出ている必要もないです。

要は「問題を読んで理解し、論理的に考えて答えを導く、そして最後まであきらめない」ことができれば誰でも解ける問題になっています。

「アルゴリズム」「プログラム」と聞くと難しいかもしれませんが、解き方は国語や英語の長文問題と同じような問題であると考えて良いです。

アルゴリズム問題に知識は不要

とはいえアルゴリズム問題はパッと見ると問題文が長く、難しい単語が出てきて解く気すらせず敬遠する方が多いのも分かります。私も最近解いてみましたが、問題文を見るたびに長くてゲンナリしてました。

しかし、じっくり問題を解いてみると下記のことが分かると思います。

難しい単語については説明してくれる

特にアルゴリズム問題においては、求められるのは知識ではなくアルゴリズムを理解することなので、難しい単語が出てきたとしても問題文の中で解説してくれます。なので知識はほとんどなくても解くことが可能です。

問題文の中にヒントが散りばめられている

問題文の中ではプログラムの説明を詳しくしてくれます。なので問題文は基本的に長いです。ですが、長い分プログラムの説明をしっかりしてくれているということであり、問題文が長いほど回答をするためのヒントがたくさん散りばめられています

ですので、問題文が難しそうでも問題文が長くても敬遠する必要はないです。逆に、問題文が難しそうで問題文が長い問題であるほど、忍耐強くしっかり問題を読んで論理的に考えることができれば、正解しやすい問題になっています。

アルゴリズム問題の対策方法

では特にアルゴリズム問題が苦手・苦手意識を持っている方はどのようにアルゴリズム問題を対策すれば良いでしょうか?ここについて解説していきます。

自分の力で過去問を解く

結局過去問を解く事がアルゴリズム問題の一番効果のある対策になります。

この過去問を解くことの狙いは3つです。

  • 問題を解く力をつける
  • 問題に慣れる
  • アルゴリズム問題への苦手意識を断つ

特に重要なのは3つ目です。アルゴリズム問題への苦手意識を断ち、あなたはアルゴリズム問題が解けるんだという自信を持っていただきたいのです。

で、この自信を持つために必要なのは、

必ず一度は自分の力で問題を解く

です。

最初はどれだけ時間がかかっても良いです。何日かかっても良いです。どれだけ紙にメモしたり図を書いたりしても良いです。重要なのは、とにかく自分で考えて答えを導き出す事です。そもそも考え方が分からないという方は、アルゴリズム問題の解き方を参考にしてくださって良いです。

答えを導き出した上で、採点をし、間違っているところがあればもう一度その部分を自分で考えて解いてください(解説を見ずに)。

これを1回分の過去問で良いので全問自分の力で解けるまで一度やってみてください。

これさえ出来れば「あなたにはアルゴリズムを解く力がある」と言えます。自信持って良いです。大げさに聞こえるかもしれませんが、実際これが出来れば「問題を読んで理解し、論理的に考えて答えを導く、そして最後まであきらめない」力はあると言えます。あとは問題に慣れることと解く時間を短くすれば良いだけです。

問題を多く解く

なので一度自力で問題を解く事ができたのであれば、ここからは問題に慣れる・問題を解く時間を短縮することに取り組めば良いです。

で、結局この「問題に慣れる・問題を解く時間を短縮する」ために必要なのも過去問を解くことです。問題を多く解けば解くほど、アルゴリズム問題への慣れが出てきますし、徐々に問題を解く時間も短縮できます。

おそらく一度過去問を自力で解いたとしても、他の問題を読むとまた「何書いてあるのか分からない…。」という印象を持つと思います。でもこれはみんな一緒なんです。少なくとも私はどの問題見ても最初は溜め息が出ます。何回解いても慣れないものです。それがアルゴリズム問題…。

でもそこでくじけずに、一度は自力で問題を解いたという自信を持って問題を読み進めてください。一度アルゴリズム問題の過去問が自力で解けたのであれば、アルゴリズム問題を解く力はあなたにはあります。問題は違えど、時間をかけてじっくり問題を読めば、他の問題も必ず解けます。

苦戦しながらも問題を解く様子

基本的に最初は時間は気にせずに自力で解くことを考えれば良いです。何度も問題を解いていれば自然と解く時間は短縮されていくはずです。アルゴリズム問題の勉強ではそれもよりもじっくり問題文を読むこととじっくり考えて答えを導き出すことを優先すべきです。

何回も解いていたらアルゴリズム問題にこんな感じの印象を持つようになると思います。

「一見問題文難しそうだけど頑張れば解けるだろう」

こんな感じの印象を持てる程度に過去問をこなしておけば、まずはアルゴリズム対策としてはバッチリだと思います。

割と効果のある問題の解き方は、「不正解の選択肢が、なぜ不正解であるかを考える」ことです。不正解の選択肢は、不正解である理由があります。もっと具体的にいうと、問題文で示されたプログラムの仕様が満たせない選択肢なんです。

問題文のどこに書いてある仕様が満たせないかを考えるためには、問題文を隅々まで読んで理解する必要がありますので読解力がつきますし、なぜ仕様が満たせないかを考えることで論理的に考える力もつきます。是非実践してみてください!

過去問入手方法

過去問は基本情報技術者試験を実施している IPA のサイトに無料で公開されています。ただし試験の解説はありません。

https://www.jitec.ipa.go.jp/1_04hanni_sukiru/_index_mondai.html

解説も読みたいという方は下記のパーフェクトラーニングがオススメです。

解説は実は私のウェブサイトでも行なっています。よく分からないところなどはコメントいただければコメントで解説したり、詳細な解説を追加したりすることもできますので気軽に活用してください!

基本情報技術者試験 午後問題「アルゴリズム」過去問の解き方 解説 まとめ

スポンサーリンク

アルゴリズム問題の種類

MEMO

図やプログラム、問題文はIPA公開の過去問題から引用しています。

出典:平成29年度 春期 基本情報技術者試験(FE)試験区分 午後 問8

ここまではアルゴリズムは誰でも解けることと、対策の仕方について解説してきました。ここからはアルゴリズム問題ではどんな問題が出題されるかをまず見ていきましょう。アルゴリズムの問題は大きく2種類に分類することが出来ます。

プログラムを作成する問題

1つ目はプログラムを作成する問題です。具体的にはプログラムの途中が抜けていて、そこを穴埋めする問題です。例えば平成29年度春期には下記のような穴埋め問題が出てきています。

選択肢は下記になっており、この中から選んで上の穴を埋めてプログラムを完成する問題です。

プログラム実行時の最終結果・途中結果を問う問題

指定されたデータをプログラムを入力した場合に、最終結果や途中の変数の状態を問われる問題です。平成29年度春期には下記のような問題が出題されています。

これはプログラムの途中結果を問われており、ループが3回目の時の sPoint の値と pDist の配列内容、pRoute の値が問われている問題ですね。選択肢は下記のようになっています。

アルゴリズム問題の解き方

ここでは上で挙げた2種類の問題をどのようにして解いていけば良いかを解説します。

プログラムを作成する問題の解き方

この問題を解く上で行うことを説明します。

ポイントは「無理にプログラムやアルゴリズムの全体像を把握する必要はない」ということです。

プログラムを細分化して解答に必要な部分に集中して解いていくことをオススメします。そのためには下記の3つを実践すれば良いです。

①「プログラム」と「プログラムの説明」の関連付け

まず行うべきことはこれです。問題文の中では詳しくプログラムの説明をおこなっています。そのプログラムの説明が、プログラムのどこの説明であるかを関連付けすることが問題を解く上での第一ステップです。

例えば平成29年度春期では[プログラムの説明]で下記のような説明が行われています。

これらはプログラム中の下記の部分を説明しています。同じ色の枠が説明とプログラムの対応を示しています。

この回は行番号まで指定してくれていたのでかなり対応づけは簡単ですね。他の回だと行番号まで示してくれていなかったりしますが、「プログラムの説明」では細かくプログラムの説明をおこなってくれていますので、どの回の問題でも「プログラムの説明」と「プログラム」を対応付けてすることは可能です。

②「プログラム」から抜けている処理を「プログラムの説明」から推測

次はいよいよプログラムの穴埋めを行って回答を導きます。②ではプログラムから抜けている処理をプログラムの説明から推測します。

①で「プログラムの説明」と「プログラム」を対応づけていると思いますので、穴埋めを行う部分のプログラムと、それに対応づいている「プログラムの説明」から、「どの処理が穴になっているか」を論理的に推測します。

上の例で言うと(a)があるのはプログラムの緑枠内です。ですのでここをさらに細分化して見てみましょう。下記はプログラムの緑枠内をさらに3つに細分化した「プログラムの説明」と「プログラム」になります。ここでも枠の色で対応を示しています。

(a)があるのはプログラムの赤枠の中なので、ここをさらにプログラムの説明と照らし合わせながら何を入れるべきかを考えていきます。

最初はこの穴埋めの部分の処理が無いものと思って処理を追ってみると不足している処理が見えてくると思います。

三角矢印は条件文を示していますので、(a)を無視して考えると、赤枠内では pDist[ j ] < pDist[ i ] が成立する時に i が j に上書きされます。

pDist[ j ] < pDist[ i ] は、出発地からの地点 j までの距離が、出発地からの地点 i までの距離が小さい場合に成立します。そして成立すれば i j で上書きされます。つまり、j に関するループ終了時点では、地点 i が出発地からの距離が最も短い地点となるわけです。

ただし、「プログラムの説明」には「出発地からの距離が最も短い地点」は、「出発地からの最短距離が未確定の地点」でなければならない記載があります。この点は上で考えた処理では考慮されていません。

つまり、この「出発地からの最短距離が未確定の地点」であるかどうかの判断の処理がプログラムから抜けていると考えられ、(a)がその処理であると推測できます。

③抜けている処理を選択肢から選択

ここまでくれば、後はこの抜けている処理をプログラムに置き換えれば良いだけです。この例題の場合では「出発地からの最短距離が未確定の地点であるかどうかの判断の処理」をプログラムに置き換えれば良いです。基本情報技術者試験の問題は全て選択式ですので、自分でプログラム化する必要はなく、選択肢から選ぶことで回答可能です。

この問題であれば選択肢は下記になっています。

ここまで来て、pFixed[ ] って何だ?と思う方もいると思います。大丈夫です。この変数の説明についてもしっかり「プログラムの説明」で説明されています。

pFixed[ i ]がfalseの場合は地点 i までの最短距離が未確定であり、pFidxed[ i ]がtrueの場合は地点 i までの最短距離が確定していると判断できそうです。

(a)は「出発地からの最短距離が未確定の地点であるかどうかの判断の処理」であり、調査対象としている地点は j で表されているため、pFixed[ j ]が false の時に true になるプログラムが回答となります。

具体的には not(pFixed [ j ]) が(a)の答えとなります。もし複数の選択肢で迷うような場合は、実際に数値を当てはめてみて考えることも良い戦略です。

まとめると、プログラムを作成する問題は、

①「プログラム」と「プログラムの説明」の関連付け
②「プログラム」から抜けている処理を「プログラムの説明」から推測
③抜けている処理を選択肢から選択

により回答することができます。「プログラムの説明」や「プログラム」を読んでいてわからない変数が出てきた場合は、ほかの「プログラムの説明」部分からその変数が説明されている部分を探して見ましょう。どこかに説明もしくはヒントが記載されているはずです。

プログラム実行時の最終結果・途中結果を問う問題の解き方

こちらの問題を解くために必要な作業を解説します。

①プログラムの入力データを整理する

まずプログラムに入力されるデータを整理します。具体的には、プログラムの各引数が何であるかを整理します。

例えば平成29年度春期の問題であれば、プログラムの引数は下記のようになっています。

さらに、プログラムの引数の仕様が表にまとめられています。

Distance[ ][ ] については図2で定義されています。地点が 0 から 6 までありますので、nPoint は 7 となります。

sp と dp については問題文に記載されています。sp は 0 で dp は 6 ですね。

sRoute[ ] と sDist は出力となる引数となりますので一旦無視して良いです。

まとめると入力データは下記のようになります。

②そのデータを入力した時のプログラムの各変数の動きを追う

①で各引数の値を整理できれば、後はこの引数の時にプログラムの動きを実際に考え、各変数がどのように変化していくかを追っていけばこの問題は解くことが可能です。

例えば下記のようにプログラムを実際に動かしていると考え、各変数がどのように変化して行くかを地道に追って行きましょう。

ここでは吹き出しを入れるスペースがなくなったので α のところで追うのをやめていますが、実際には設問に回答できるまでこれを繰り返し行います。これをやるためには忍耐力・根気が必要ですが最後までやれば(回答できるところまでプログラムを追うことができれば)必ず回答することができます。

まとめると、プログラム実行時の最終結果・途中結果を問う問題は、

①プログラムの入力データを整理する
②そのデータを入力した時のプログラムの各変数の動きを追う

により回答することができます。前述のプログラムを作成する問題よりも考える作業は少なく、プログラムの動きを追う単純作業により答えを導き出すことができます。ですので、忍耐力があれば時間をかければ誰でも問題を解くことが可能です。

まとめ

いかがでしょう?少しはアルゴリズム問題の難しいイメージを払拭することができたでしょうか?

アルゴリズムは「問題を読んで理解し、論理的に考えて答えを導く、そして最後まであきらめない」ことができれば誰でも解ける問題であり、問題文の中にヒントが散らばっています。ですので、難しいと思って無回答で0点というのはもったいないです。

またアルゴリズム問題は大きく「プログラムを作成する問題」と「プログラム実行時の最終結果・途中結果を問う問題」とに分類することができます。それぞれで問題の解き方のポイントが異なりますので、それを理解し、忍耐強く問題を解いていきましょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です