データ構造とアルゴリズムを再学習する中で、LeetCodeを150問ほど解きました。その結果、これまで苦手だったグラフアルゴリズムも含め、自分で使いこなすレベルまで引き上げることができました。
本記事では、その過程で得た学びや、なぜこれまで挫折していたのかを振り返ります。
動機
これまで私は、データ構造とアルゴリズムに関する書籍を何冊か手に取り、並行してAtCoderの問題にも取り組んできました。しかし、どの書籍も終盤に差しかかるグラフの章にたどり着く頃にはモチベーションが落ちてしまい、内容の難しさも相まって、十分に理解しないまま学習を終えてしまうことが多くありました。
それでも数年に一度は学習を繰り返していたこともあり、その積み重ねが現職の入社試験におけるコーディングテストの突破につながりました。現在は転職の予定はありませんが、今後コーディングテストを受ける機会があっても安定して突破できるレベルまで、実力を上げておきたいと考えています。
また、コーディングテスト対策に限らず、コンピューターサイエンスの基礎としてデータ構造とアルゴリズムを体系的に理解することの重要性も強く感じていました。特に、これまで理解が曖昧だったグラフアルゴリズムについては、腰を据えてしっかり理解したいという思いがありました。
やったこと
今回の学習では、Web教材であるCodingInterviewCatを利用して理論を学びつつ、LeetCodeで問題演習を行い、合計で約150問の問題を解きました。150問という数は、LeetCodeユーザーの中では上位10%程度に位置する回答数であり、頻出分野を一通りカバーするための最低限のラインだと感じています。LeetCodeの問題は主にEasy〜Mediumを中心に解き、頻出パターンを網羅することを意識しました。毎日3時間程度の学習を50日続けたため、およそ150時間程度を要しました。

Web教材だけでは理解が難しい部分については、後述する書籍を補助的に参照しました(書籍に掲載されている演習問題は解いていません)。 また、LeetCodeの問題演習ではChatGPTを使い倒しました。具体的には以下のような場面です。
- あと一歩で解けそうだが詰まっているときにヒントを得る
- 解法の方針が正しいか確認する
- 実装が汚くなってしまった時に、より綺麗な書き方を知る
- 模範解答の意図が理解できないときの補助
これらを組み合わせることで、グラフを含めた主要なデータ構造・アルゴリズムを、自分でも使えるレベルまで理解することができました。
参考: Coding InterviewCat | InterviewCat - テック企業面接対策プラットフォーム
学び
LeetCodeの問題を解き続ける中で、まず大きく感じたのは「使えるデータ構造の引き出しが増えたこと」です。これまでは配列やハッシュテーブル程度しか扱えませんでしたが、スタック、キュー、ヒープ、連結リスト、木構造、Union-Findなどについて、それぞれの操作(挿入・削除・探索)にかかる計算量を理解し、状況に応じて適切に選択できるようになりました。
データ構造の理解が進んだことで、それらを前提とするアルゴリズムの理解も大きく深まりました。例えば、スタックや再帰を用いたDFS、キューを用いたBFSなどを、「なぜそのデータ構造を使うのか」という観点でも理解できるようになりました。
特に苦手意識を持っていた最短経路アルゴリズム(ダイクストラ法、ベルマン・フォード法、ワーシャル・フロイド法)についても、スムーズに理解できるようになり、自信がつきました。グラフの構造によっては、ダイクストラ法にヒープを組み合わせることで計算量を大幅に削減できるといった点も、ヒープを理解したからこそ腹落ちさせられたと思います。
また、LeetCodeはデータ構造とアルゴリズムにフォーカスした問題が多く、学んだ知識をすぐにアウトプットできる設計になっているため、「できることが着実に増えている」という実感を毎日得ることができたのも大きなポイントでした。
なぜ今までうまくいかなかったのか
今回手応えを感じたアルゴリズムとデータ構造に関する学習について、なぜ今までうまくいかなかったのかを分析してみました。
演習問題を復習していなかった
これまでの学習では、演習問題を一度解いて終わりにしてしまい、十分な復習を行えていませんでした。その結果、理解が曖昧なまま次の新しい内容に進んでしまうことが多くありました。
データ構造とアルゴリズムは、基礎的なトピックであれば単独でも理解できる場合がありますが、応用的な内容になると、他のデータ構造やアルゴリズムの理解を前提としていることが少なくありません。そのため、前提となる知識が不十分なまま新しい内容に取り組むと、途中で詰まってしまう場面が多いことに気づきました。例えば、幅優先探索(BFS)はキューが、深さ優先探索(DFS)はスタックや再帰の知識が前提となっていますよね。
そこで、演習問題の初回の理解度をスプレッドシートにまとめ、それに応じて復習を行う仕組みを取り入れました。具体的には、演習問題を以下の3つに分類しました。
- ⭕:初見で解けた
- 🔺:ヒントを見て解けた
- ❌:ヒントを見ても解けなかった
平日は新規の問題に取り組み、休日は復習に充てるサイクルとしました。特に、❌が2回連続した問題(初回も復習時も解けなかった問題)については、なぜ解けなかったのかをChatGPTに壁打ちしながら整理し、自分の理解や発想のどこが不十分だったのかを深掘りするようにしました。
このように復習のプロセスを明確にしたことで、理解の抜け漏れを防ぎ、知識を定着させることができるようになりました。
AtCoder中心の学習
(※AtCoderは非常に優れたサイトであり、このサイトを通じてデータ構造とアルゴリズムの知識や経験を深めた方も多いと思います。あくまで、当時の自分には合っていなかった点について記載しています。)
これまで私は、書籍でインプットを行い、AtCoderで演習するという形で学習を進めていました。しかし、自分にはいくつか合わない点があり、効率よく学習を進めることができませんでした。
まず、AtCoderは問題文のストーリーを理解するのに時間がかかり、データ構造やアルゴリズムそのものに集中しづらいと感じていました。また、レートを上げることを目標とする場合、コンテストへの参加が前提となりますが、開催時間が夜であることが多く、朝型の自分には継続が難しいという課題もありました。(現在では、定期的なコンテスト参加が不要で一発認定が行われるPASTを併用することで、この問題はある程度解消できるかもしれません。)さらに、AtCoderはトピックごとに体系的に問題を解く構造にはなっていないため、基礎力が十分でない段階では学習効率が悪いと感じました。加えて、入出力処理を自分で実装する必要がある点も負担となり、アルゴリズムそのものに集中しづらい要因でした。
UIの観点でもいくつか課題を感じていました。AtCoderでは提出のたびにページ遷移が発生するため、試行錯誤のコストが高くなりがちです。また、Runtime Errorが発生した場合でも、どこでエラーが起きているかを把握できないという問題がありました。一方でLeetCodeは、同一画面上でサンプルケースの実行(Run)と全てのテストケースの実行(Submit)を行い成否を確認でき、エラー内容も表示されるため、デバッグがしやすい設計になっています。
加えて、方針自体は正しいにもかかわらず、境界値の扱いなど細かな部分でAC(正答)に時間がかかることも多くありました。これはLeetCodeでも同様に起こり得る問題ですが、LeetCodeではChatGPTを活用することで即座にフィードバックを得られ、改善につなげることができました。
その他の要因
書籍中心の学習では、紙面の制約から探索過程の説明が簡略化されていることが多く、「なぜその順序で探索されるのか」といったイメージが掴みにくいことも課題でした。 また、インプットに偏り、十分な演習を行っていなかったことも理解が定着しなかった原因だと感じています。
データ構造とアルゴリズムの学習するうえでの個人的結論
これらのの経験から、データ構造とアルゴリズムの学習において重要だと感じたポイントは以下の通りです。
- 図や動画が充実したWeb教材で理論を学ぶ
- LeetCodeで演習を積むことで理解を定着させる
- 書籍は補助的に活用し、理解を補強する
この組み合わせが、最も効率よく学習を進める方法だと考えています。今後学び直しをするうえでも、このステップで行おうと思います。
教材の感想
今回の学習で利用した教材について、それぞれの特徴と感想をまとめます。
[Web] CodingInterviewCat
CodingInterviewCatは「コーディング面接対策」を謳っていますが、実際にはデータ構造とアルゴリズムを体系的に学びたい人にも非常に適した教材だと感じました。自分自身、面接対策だけを目的としていたわけではありませんが、この教材がなければ今回の学習は途中で挫折していたと思います。29,800円という価格ですが、この教材のお陰で100時間以上学習を行えたため、十分払う価値があったと感じています。
理論の解説と例題がセットになっており、学んだ内容をすぐに演習できる構成になっています。このスタイルは高校数学の参考書である青チャートを元に考案されているようで、実際に非常に効果的でした。難易度が★〜★★★★★で示されている点も、問題の取捨選択に役立ちました。自分は高校時代に青チャートを何十回も解き直し数学が得意になった経験があるため、この青チャートを元に考案されたというコンセプトにかなり期待感がありましたが、実際にやってみてこの理論+演習のセットこそがこの分野の学習に最も効果的だと感じました。
特に良かった点として、BFSやDFSの導入が非常に丁寧であることが挙げられます。多くの書籍ではグリッドグラフを前提に説明されることが多いですが、本教材ではまず木構造での理解を深めてからグラフへ進む構成になっており、ステップバイステップで理解することができました。また、「スタックによるDFSは理解が難しくなりがち」といったように、初学者目線での割り切った説明も多く、つまずきにくい設計になっている点も印象的でした。
一方で、Bit Manipulationや貪欲法など一部の分野のコンテンツは未整備であるため、この点は今後の拡充に期待したいところです。
似たコンセプトの教材としてNeetCodeもありますが、英語であるため、日本語で学びたい場合はCodingInterviewCatの方が取り組みやすいと感じます。自分は今後、NeetCodeにも取り組む予定です。
[書籍] 独学コンピューターサイエンティスト Pythonで学ぶアルゴリズムとデータ構造
Pythonで書かれているため非常に読みやすく、データ構造とアルゴリズムの入門書として優れた一冊でした。各トピックが広く浅く整理されており、詰まることなく最後まで読み切ることができました。
データ構造やアルゴリズムの説明の後に、コーディングテストを意識した問題も掲載されており、学んだ内容をどのように応用するかをイメージしやすい構成になっています。また、図が豊富で探索過程を視覚的に理解できる点も良かったです。 これまでC++ベースの書籍で挫折してきた自分にとって、Pythonで書かれていることは大きなメリットであり、初めて最後まで読破できた書籍でもありました。
[書籍] 問題解決力を鍛える! アルゴリズムとデータ構造
本書はC++で書かれていますが、すでにPythonで基礎を学んでいたため、復習としてスムーズに読み進めることができました。図やイラストが豊富で、探索やデータ構造の遷移が非常に分かりやすく説明されています。 また、計算量やアルゴリズムの背景にある数学的な説明も丁寧で、「なぜそうなるのか」を深く理解したいときに非常に役立ちました(難しい証明部分は適宜飛ばしながら読みました)。
特にグラフアルゴリズムの解説が充実しており、この分野を強化する上で非常に有用でした。一方で、内容はやや高度であるため、初学者が最初の一冊として読むにはハードルが高いと感じました。実際、自分も最初にこの本に取り組んだ際は理解に時間がかかり、学習が進まない原因の一つになっていました。
まとめ
今回、LeetCodeを150問解くことで、データ構造とアルゴリズムに対する知識が増え、自分で使いこなせるレベルになってきました。特に、これまで苦手意識のあったグラフアルゴリズムについても、演習を通じて体系的に理解できました。
振り返ってみると、これまでうまくいかなかった原因は、インプット中心の学習や、自分に合わない教材・環境での演習にありました。一方で、今回のように「わかりやすいWeb教材で学び、LeetCodeで演習し、必要に応じて書籍で補強する」というサイクルを回すことで、効率よく理解を深められることがわかりました。
今後は、今まで解いたLeetCodeの問題の復習や、NeetCodeで新しい分野を学ぶなどにチャレンジしていきたいと思っています。





