
アルゴリズムの問題が難しくてどう手を付けたら良いか・・・

アルゴリズムを勉強しているけど点数が一向に伸びない・・・
アルゴリズムの勉強を始めた人は、大抵こんな悩みを抱えているのではないでしょうか?
私もアルゴリズムを始めたばかりの時は、「こんな難しい問題解けるか!」と勉強を投げ出した一人です。
ただそんな私でもアルゴリズムの問題に正解して、基本情報技術者試験に合格できたのですから、貴方にも十分にチャンスがあります。
そこで今回は、アルゴリズムの勉強に苦戦している人に伝えたい、アルゴリズムの勉強法やアルゴリズムの問題を解くために必要な準備について解説します。
目次
アルゴリズムという分野は、基本情報技術者試験に出題される問題の中でも難関とされる分野です。
またアルゴリズムの配点は、25点。
アルゴリズムの配点は他の問題と比較しても、配点は明らかに高く、試験の合否を握っていると言っても過言ではありません。
そのためアルゴリズムの問題に正解できれば、
間違いなく試験合格に近づくと思って、気合を入れて勉強してください。

基本情報技術者試験の鬼門なんて呼ばれるアルゴリズムだけど、何であんなに難しく感じるんだろうね?

理由としては、予習が通用しにくい所にあると思う。

どういうこと?

アルゴリズムの問題は、過去に出題された問題からの引用はほとんど無い。加えて疑似言語の読み方を覚えている、処理を覚えているだけ、といった丸暗記では試験に通用しないからな

なるほど。だからアルゴリズムは難しいのかも知れないね
・アルゴリズムで最低限覚えるべき内容

アルゴリズムでは、最低限覚えておくべき要素があります。
- 疑似言語の読み方
- 変数の種類
- 変数の代入
- 条件式によるデータの流れ
- 繰り返し文の処理
- 配列の扱い方
- 基本的なプログラムの流れ
今挙げた要素は、アルゴリズムの問題を解くためには必要不可欠な要素です。
またアルゴリズムに自信がなくても上記の要素を覚えておくだけで、アルゴリズムの基礎的な問題に答えられる可能性があります。
だからこそどんなに時間が無いとしても、今回挙げた内容だけでも覚えておくことをおススメします。

疑似言語の読み方とか変数の種類とかは分かるが、基本的なプログラムの流れってなんだ?

プログラムがスタートすると上から下へ処理が流れる。副プログラムが終わったら、処理がどこに移動するとかが、プログラムの流れと言える要素だね

なるほど。

あとはbreak文やreturn文といった要素もプログラムの流れに入るかな。
・”プログラムを動かしている”という感覚が重要

アルゴリズムの問題を試験本番で解くために重要なのは、
プログラムをどれだけ読んできたか、プログラムをどれだけ追ってきたかという経験です。
だからこそアルゴリズムの問題は、問題を解くのではなく、
プログラムを追うという感覚を重視して勉強するようにしましょう。
ちなみに何故プログラムを追うという感覚を重視した方が良いかというと、アルゴリズムの問題として出題されるプログラムは、毎回内容がガラリと変わるからです。
そのためしっかりプログラムを追わずに、丸暗記によって「こんな感じだろ」という感覚で問題を解いていると、
本番の試験になってプログラムが追えないという状況が発生します。
またアルゴリズムの勉強をある程度進めて、問題を解き慣れた時に気をつけたい状況があります。
それは「プログラムの処理を追わないで答えを書いてしまう」といったパターンです。
ろくにプログラムを精査しないで問題を解くといった状態は、アルゴリズムの勉強においては絶対にダメ。
アルゴリズムの内容が全く身に付かないため基本的にはNGと思ってください。

アルゴリズムの問題って、適当にカンで答えると間違えるように上手く作られているよねw

大抵の問題は、単純に考えると間違えるように、捻りが加えられているからな。安易に答えようとすると、痛い目を見るパターンがほとんどだ

だからこそ、しっかりプログラムを追って、データを当てはめて考えてみてね。
・プログラムを読んだ量も重要

アルゴリズムの問題を解く際には、プログラムを読んできた量も重要です。
何故プログラムを読んできた量が重要になるかというと、アルゴリズムの問題はプログラムを読んできた量で、
問題を解く速さが格段に変わってくるからです。
だからこそアルゴリズムの勉強を進める際には、過去問題を使ってプログラムをひたすら読んで、プログラムに慣れてください。
ちなみにどのくらいの過去問題をやれば良いかというと、
- 時間が無い場合は、5年分×3周
- スケジュールに余裕がある場合は、10年分×3周。
程度が目安となるでしょう。
また1週目と2週目は、プログラムをしっかり読むといった確実性を。
3周目は、速度を重視した練習を心がけてください。

速度を重視するって言うが、どのくらいの時間で問題を解くのが目安になるんだ?

そうだね。大体1問辺り30~45分ぐらいが目安になるかな。もちろん小さな設問とかをすべて含めた場合ね

かなり早い気がするな・・・

30分っていうのは、初めは難しいかも知れないね。でもどんなに時間が掛かっても、45分程度で問題を解かないと、他の問題を解く時間が無くなるからね。

だからこそ普段の勉強で素早く解く練習が重要だな
・テストケースを考えて過去問題を再利用


アルゴリズムの実力が付いているか、いまいち実感できない
そんなことを考えているあなたには、
テストケースを考えて当てはめてみるという方法をおススメします。
なぜ上記のような方法をおススメするかというと、アルゴリズムにおける問題の解き方は、突き詰めれば以下の3つに絞れるからです。
- 問題文に書かれている処理をプログラムに当てはめる
- 問題文に書かれているデータをプログラムに当てはめる
- プログラムに書いてある処理を読み取る
そして上記の条件を満たすのが、テストケースを考えて当てはめてみるという勉強法です。
またテストケースを考えて当てはめる際には、
- プログラムの処理
- 正常に終了するデータ
- 異常終了するデータ
- 問題文に書かれているプログラムの概要
といったポイントを理解しておいてください。
ちなみに自分でテストケースを想定して勉強すると、プログラムを正確に読めているか、データがトレースできているか、というポイントが分かります。
他にもテストケースを考えて当てはめてみるという方法のメリットは、アルゴリズムの実力が付くだけではありません。
答えを覚えてしまっている過去問題を再利用できるという利点もあります。
そのため問題が解けなくなった時だけでなく、問題を解きなおす時も重要な方法と言えるでしょう。

テストケースを当てはめてみるという方法をまとめると、以下のような手順になるね
- プログラムの処理を把握する
- テストケースを当てはめてみる
- テストケースを変えてみる

テストケースを当てはめてみるという方法は、初めの内は時間が掛かる方法だが、確実性は高い。

だからこそテストケースを当てはめてみるという方法は、必ず身に付けておいてほしい解き方と言えるね
・問題を間違えた時にこそ実力が付く

アルゴリズムという分野は、他の分野に比べて、問題自体が難しく、プログラムを読む際には苦痛が伴うと言っても過言ではありません。
しかし、そんな人ほど覚えておいてほしいのが、
「正解した問題より、間違えた問題の方が身になりやすい」という点です。
そして
「間違えた問題を振り返り、正しく理解した時に実力は大きく向上する」
というポイントも覚えておいてください。
間違えた問題を振り返るというポイントはアルゴリズムの場合、問題を間違えやすいため重要度が跳ね上がります。
最も重要であるポイントとも言えるため、必ず「問題を間違えて振り返った時こそ実力が付く」という点を覚えておいてください。

よく人が成長する時って、失敗した時なんて言うけど、アルゴリズムでも同じようなことが言えるのかも知れないね。

アルゴリズムの勉強は、間違えた問題を理解するところから始まると言っても過言じゃない。

だからこそ間違えた問題をキッチリ理解する必要があるね
・ロジックに関しては丸々覚えなくて良い

アルゴリズムで使うロジックに関しては、あくまでも時間に余裕があれば覚えるくらいで構いません。
なぜロジックを覚えるのが必須ではないかというと、ソートや探索法、再帰といったロジックを覚えたところで、
ロジックが丸々出題されるといったパターンは少ないからです。
またロジックが出題されるとしても、
ロジックにアレンジが加えられている方が多い、
どのようなロジックになっているか確かめる必要があるといった点から、結局その場でプログラムを読む羽目になります。
ただアルゴリズムのロジックを丸々暗記する必要はありませんが、ロジックの概要だけは把握しておくべきです。
各種ソートや再帰といったロジックがどのような動きをするのか、というポイントぐらいはチェックして試験に挑んでください。

今回の見出しだけ見ると、ロジックを覚えなくても良い、という風に思う人がいるかも知れないね。

だがロジックを覚えてくと試験において有利になることも確かだ。だから手を抜いて良いって訳じゃない点を頭に入れておいてくれ
・初心者はフローチャートを書くところから

フローチャートは、アルゴリズムの基本と呼べる要素です。
アルゴリズムの初心者がプログラムに慣れるためにはピッタリな方法であり、アルゴリズムを見たことの無い人でも分かりやすく、処理が理解できるようになる素晴らしいツールです。
だからこそアルゴリズムの経験がない初心者の人は、できる限り大目に勉強時間を確保して、フローチャートを書くところから勉強を始めましょう。
ちなみにフローチャートを書いて、ある程度アルゴリズムに慣れたら、
早い段階でプログラムを読む練習を始めてください。
プログラムを読む、アルゴリズムの点数を上げるといった目標を忘れないようにしてください。

よくある話だけど、練習のための練習をしないようにね

今回で言えば、フローチャートを書くという行為だな

そうだね。あくまでも目標はアルゴリズムで良い点数を取るために。あくまでもプログラムを読むのが目的であって、フローチャートを書くのが目的じゃないからね
・メモ用紙やノートを置いて勉強を進める


アルゴリズムの勉強は時間が掛かる・・・
そんなことを考えているあなたには、
問題用紙の隣にメモ帳やノートを置いて勉強する方法をおすすめします。
人によっては「なにを当たり前のことをw」と笑ってしまう方法かもしれませんが、アルゴリズムにおいては、このメモを取るという行為が物凄く重要です。
例えば、メモを取るという行動を習慣化すると、
- 問題文やプログラムで理解した箇所をメモする
→問題を確認する手間が減るため、解くスピードが上がる - データの流れを逐一メモする
→プログラムを正しく追えるようになる
といったメリットが発生するようになります。
ちなみにメモを取る際に解いた問題のメモは、
どの問題を解いたか分かるように保管して後で見直せるようにしておきましょう。
すると再度その問題を解いた際に復習しやすくなるため、
勉強の効率化と問題が理解しやすくなるといったポイントに繋がります。

個人的にはノートなどの紙によるメモだけでなく、パソコンのメモ帳機能を使ったメモもおすすめだよ

パソコンのメモ帳は、書いたり消したり、保存するという行為がとても楽だから、後で見返すのが物凄く簡単だ

もちろんスマートフォンとかでも良いから、是非とも電子端末でメモを取るという行為を試してみてね
・過去の「難問」「良問」「易問」をまとめてみました

最後に基本情報技術者試験で出題された過去問題を、独自に難問、易問、良問といった形で分けてみました。
アルゴリズムの勉強を始めたばかりの時は、易問を。
アルゴリズムの勉強に慣れた後は、良問や難問を解いてみてください。
また問題によっては、問題を解くポイントを記載しています。
問題を解く際のヒントにして頂ければ幸いです。
難問
- 平成29年春期
- 平成26年秋期
編集距離のX(削除)とY(挿入)の関係に気付けるかがカギ - 平成26年春期
iとp始点と終点の関係性に気付けるかがポイント
易問
- 平成28年秋期
- 平成24年春期
- 平成21年秋期
良問
- 平成27年春期
時間が掛かるが易問寄りの問題 - 平成25年春期
当てはめるデータを変えてみると・・・
まとめ
今回はアルゴリズムの問題を解くための準備について解説しました。
アルゴリズムで最低限覚えるべき内容
- 疑似言語の読み方
- 変数の種類
- 変数の代入
- 条件式によるデータの流れ
- 繰り返し文の処理
- 配列の扱い方
- 基本的なプログラムの流れ
- ”プログラムを動かしている”という感覚が重要
- プログラムを読んだ量も重要
- テストケースを考えて過去問題を再利用
- 問題を間違えた時にこそ実力が付く
- ロジックに関しては丸々覚えなくて良い
- 初心者はフローチャートを書くところから
- メモ用紙やノートを置いて勉強を進める
アルゴリズムは、とても難しい分野です。
それこそ基本情報技術者試験を受験している殆どの人が、苦戦する分野と言えるでしょう。
だからこそ今回こういう形で、アルゴリズムの問題を正解するにはどのような準備をしたらいいか、というポイントを解説しました。
そのためアルゴリズムに苦戦している人は、是非とも記載した内容を参考にして頂ければと思います。
ちなみに以下のページでは、アルゴリズムの問題を解くための”コツ”を解説しています。

こちらも今回の記事と合わせて、勉強に活用してみてください。
コメント