Zubora Code

NeetCode 150 全問の解き方とポイントまとめ & 感想

NeetCode 150という、LeetCodeから主要な分野の問題を抽出したリストを全て解いたので、今後の復習のために全問のポイントをまとめておきます

Published: 29 August, 2024
Revised: 29 August, 2024

LeetCode とは

プログラマ・ソフトウェアエンジニアとして就職・転職の面接を受ける際に出題されるデータ構造とアルゴリズムに関わる問題をまとめたサイトです。競技プログラミングと比較するとLeetCodeの問題はより「データ構造とアルゴリズム」に直接的な問題が多く、"勉強してる感" が強い印象があります。

現時点で3000問以上存在するようで、(競プロガチ勢でもない限りは)とにかく勉強に時間がかかります。本当に人によるとは思いますが、大体数ヶ月から数年のスパンで進めていくものです。

https://leetcode.com/problemset/


(各企業が面接で実際に出した問題がそのまま載っているような感じらしいので、これって倫理的にどうなの?という話が定期的にあがっています。ただまあ、もはややらないとむしろ出遅れてしまうぐらい必須の存在になっている印象です)

NeetCodeとは

NeetCodeさんという元Googlerの方が、Googleに就職する前のニート時代にLeetCodeで勉強して苦労した経験を元に作成されたサイトです。「LeetCode 進め方」とかで検索するとNeetCodeという単語がたくさん出てきて、なんじゃそりゃと思って調べてみたら辿り着きました。サイトはこちらです。

https://neetcode.io/

以下の動画を見るとどんなものか分かり易いと思います。NeetCodeさんはその解説の上手さもそうですが全体的に動画のクオリティも素晴らしいです。

Redditに「Why is everybody doing Neetcode 150?」という質問があがっているくらい有名なようで、LeetCodeを初めて進める人にとってはデファクトスタンダードになっていると言っても過言ではありません。NeetCodeには以下のような特徴があります。

  1. LeetCodeの代表的なトピックから150問が選ばれており、全ての問題に丁寧なYouTubeの解説動画(英語)がついている
  2. どのトピックをどういう順番で解いていくと知識獲得の観点で効率が良いかを示したロードマップがある。
  3. 一つ一つの問題はLeetCodeの問題に対応しているが、NeetCodeというサイト上でも問題が解ける

このロードマップと解説動画がかなり秀逸で、3~5年くらい前にLeetCodeをちょろっとやってた時はまだ自分の目に留まるほど有名でなく、LeetCodeの勉強って大変だな〜という印象を持っていたので、進めるにつれてどんどん感動していきました。NeetCodeさんマジリスペクトです。


LeetCodeのMediumレベルの問題を20~30分程度で解けるようになれば大体の面接はデータ構造とアルゴリズムに関しては大丈夫という感じのようですが、Redditのスレッドを見ている限りでは、この150問のパターンをしっかり理解していれば他の問題もかなり解けるようになるようです。


なぜ今NeetCode(LeetCode)をやるのか?

そもそも今育児休業中ですし、現職に不満はありませんし、今すぐ具体的に転職しようと考えているわけではありません。

本業はさておき、プライベートでは今年はずっとスマホアプリ開発ばかりやっていて、既に2つiOSアプリをリリースしています。

特に時もちはリリースから4ヶ月で2500ダウンロードを超え、2024年9月4日発売のananでも取り上げられるくらいには流行ってきています。この件についてはまた別途記事を書きます。


とはいえアプリ開発一本で食っていくには程遠く、新機能開発や新アプリのアイデアも一旦煮詰まってきていてあまりやれることがなく、せっかく普段よりは多少は時間があるのに勿体無いなーと思いました。


アルゴリズムとデータ構造の分野は大学でも勉強しましたしプライベートでも過去にも勉強してましたが、普段の仕事でがっつり触れるものでもなく、中々自信を持てるレベルにはなれておらず、とても勉強に時間がかかるものなので中途半端な状態になっていました。せっかくなので、この時期に知識をしっかり定着させておき、今後の活動の幅を拡げるのに活かそうと思いました。個人的には今後のキャリア人生では「自分が作ったプロダクトを海外含め世界に向けて発信する」ということと、「自分自身でオーナーシップを持ったビジネスをやっていく」ということをやっていきたいと思っています。後者に関しては副業として既に具体的に走り出しています。前者に関してはまだあまりできていないので、本業であれ副業であれ、そろそろ本格的にやっていこうと思ってます。その具体的な取り組みの内の一つがNeetCodeの勉強です。

この記事の目的

基本は以下のroadmapをBFS(幅優先探索)の要領でまとめていきます。

https://neetcode.io/roadmap

このロードマップでは、各トピックの問題を解き終わると赤くなるように作られています。私は既に150問全て解いた上で、3~5回程度は解き直しもしました。結構理解が深まってきていますが、まだ復習が必要な問題もあります。そこで、今後自分が復習する時に要点を拾いやすいようにまとめておくことにしました。かなりボリューミーなので、途中所々結構雑なところがあると思います。復習のタイミングで気づいたら適宜メンテしていきます。

また今回勉強していて、NeetCodeさんはもちろんですが、Dynamic Programming Playlist - Striver など、YouTube動画の解説の分かり易さに感動しました。私はこれまでずっと「勉強は本を読んで自分一人でやるもの」だと思ってやってきた節があったので、YoutubeやUdemyなどの動画で勉強したことはほとんどありませんでした。ただ、こういったAha的な理解が重要な分野については、今更ながら動画コンテンツの可能性を強く感じました。今のところ日本語で充実した解説動画は見当たらなかったので、今後時間ができたら自分自身が解説とかもできたらなーと思っていたりします。人に説明することで自分の理解も深まったりするので。ちょっと直近は色々やりたいことがあるのでまだ先になるとは思いますが。



全て一つの記事にまとめるとあまりに長過ぎるので、大体はトピックごとに一記事書いています。

各トピックの記事


NeetCode150問終えての感想と今後

データ構造とアルゴリズムの分野は全てのソフトウェア開発に関わる基本的なことです。私はアプリケーション開発がメインのソフトウェアエンジニアなので、普段の仕事ではDBやAPIの設計やSpring BootやNext.jsといったフレームワークを使った今すぐ役立つ開発技術ばかりを学んだり使ったりしているため、データ構造とアルゴリズムの分野の知識が普段の仕事からブラッシュアップされることはほとんどありません。

ずっとデータ構造とアルゴリズムの問題はそんなに得意ではなく、すごい競プロerなどを見かけては劣等感を抱いたりしていましたが、今回の勉強を通してそれなりに自信がついてきました。恐らくこれで初見の問題でも手も足もでないという状態にはならないと思います。

ただ重要なのは未知のMediumレベルくらいの問題を初見で20~30分以内を目安に人に説明しながら解けることです。まだほとんどこのNeetCode150の問題しかやっていないので、この検証は今後の勉強で続けていこうと思ってます。ここ1ヶ月くらいはかなりNeetCodeに比重を置いてしまったので、今後は他の個人開発とか勉強とかに比重を移していこうと思ってます。が、今回まとめた記事等を使って今後も定期的に復習しつつ、毎日数問程度は問題を解いていこうと思ってます。

この後ですが、個人開発しているアプリの問い合わせ対応や追加開発等をまず優先してやります。その後、なんらかの形で一旦自分のこれまでのキャリアを棚卸ししようと思ってます。

その次は、オブジェクト指向プログラミングの基本的な内容を復習したいと思ってます。普段開発していると結構ワンパターンな感じになってきて学びが少なくなってくるので、改めて主要なデザインパターンや原則を自分の言葉で整理しておくことは、今後大きな環境変化があった時などに活きてくると思ってます。またシステム設計についてはそれなりには出来るつもりですが、これも結構社内PF前提で考えがちなので、このタイミングで改めて一般論を深掘りしておきたいと思ってます。

やりたいことだらけでちょっと圧倒されちゃいますが、コツコツ少しずつ進めていきます。

Toshimitsu Kugimoto

Software Engineer

仕事では決済やメディアのWebやスマホアプリのBE開発、WebのFE開発をやっています。 JavaとTypeScriptをよく使います。プライベートではFlutterでのアプリ開発にも挑戦中です。