競プロ初心者がLeetCodeを150日間継続した話

# LeetCodeを始めたきっかけ
7月ころにふとLeetCodeに関する記事を読みました。
そこにはGoogleなど大手ではLeetCodeによるコーディング面接が行われていると書かれていました。

そこで、ちらっとアカウントを作成して挑戦してみました。HARD問題に挑戦してみたのですが、あえなく撃沈しました。ここで闘争本能に火が付きました

# スペック
普通のITエンジニアです。バックエンドもフロントもインフラもだいたいやってます。プログラミングは苦手ではないですが、競プロは避けて生きてきました。アルゴリズムは一通り授業で学んだレベルです。


# LeetCodeとは
[LeetCode](https://leetcode.com/)は他の競プロサービスと同じように週次・隔週コンテストが開催されています。それとは別に毎日一問課題が出され、継続すると商品と交換ができるコインが貰えたり称号(バッジ)がもらえたりします。
個人的な印象としてはAtCoderなどのガチ系よりもライトなイメージがあり、初心者でも入りやすい気がします(あくまで個人的な印象ですが)。
[問題はこのような感じで出題されます(日本語はありません!)](https://leetcode.com/problems/two-sum/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707111/3da65bd7-750c-2643-350a-769bf977bd72.png)


# 継続のためのモチベーション維持
LeetCodeには継続を感化する仕組みが備わっています。
### 1. 草が生やせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707111/99db3998-68cd-9e5e-1c36-324831080c63.png)
マイページで画像のように草がはやせるようになっています。継続日数も記録として残るため、継続しようという気にさせてくれます。

### 2. 1日1問課題が出される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707111/caaba13e-5707-2e59-30fd-d84a7af58a15.png)
LeetCodeでは一日一問、過去のコンテストの問題が課題として出題されます。その問題をクリアすると画像のようなチェックマークが付きます。一ヶ月フルコンプリートするとバッジがもらえます。バッジをもらうと嬉しくなりますよね。

ちなみに、課題や草の1日の切り替わりはUTCの0時というのも日本在住ではメリットだったりします。その日の問題が解けずに苦しんだとしても、朝9時まで徹プロできます。


### 3. 個人的なモチベーション維持
ツイッターで以下のようなツイートをし、毎日このツイートにぶら下げて問題の答えを貼り付けていっています。フォロワーの前で恥をかけないという気持ちも増すため継続する意欲が維持されます。

https://twitter.com/kabuakantech/status/1547876443711217664


# 150日継続して身についたこと
### 自信
継続して一番身についたのは自信です。今まで競プロを避けてエンジニアをしていたのですが、周りに競プロガチ勢がいたこともありプログラミングへの自信を持てずにいました。継続してみてある程度競プロというものを理解でき、自分のコーディングにも自信を持てるようになりました。

### アルゴリズム
競プロの世界に踏み入れなければ知る由もなかったアルゴリズムをたくさん身につけることができました。
`セグメント木`、`Trie木`、`Union Find`、`Monotonic Stack`などなど、いろいろなアルゴリズムを身につけることができました。私の本業でアルゴリズムを使う可能性はかなり低いですが、いざとなったときの引き出しとして持っておくことに損はないと思います。

### 計算量
計算量はとにかく気をつけるようになります。
Listの追加・削除のオーダー、探索のオーダーなどなど

### Javaの標準コレクション型
私は`Kotlin`で問題を解いているのですが、Javaのコレクション型で知らないものがいくつかあったりしてその勉強にもなりました
`PriorityQueue` や `ArrayDeque`、`TreeSet(TreeMap)`などは使ったことがなかったのですが、便利すぎて本業でも使うことがありそうな気配があります。

### プログラミング言語そのもの！
私は以前から`Kotlin`が一番好きな言語だったのですが、LeetCodeで`Kotlin`を使ってみるとまだまだ知らない事がたくさんあったことに気付かされました。プログラミング言語を極める際も競プロは役に立ちました。

ちなみに、以前私が新入社員の研修で軽く競プロの問題を解く勉強会があったのですが、その際は`Scala`を使って解きました。その時の私は`Scala`ほぼ初心者だったのですが、課題を解くことを通じて`Scala`を深く知る機会となりました。
このように競プロは新しいプログラミング言語を学ぶ際にももってこいのコンテンツだと思っています(※なお私は一時期Rustで解いていたのですが挫折してしまいました)

### 解く速度の向上
最初のほうが1問解くのに1~3時間かかることもあり、かなり大変な思いをしていました。
現在では早くて3分、難しい問題でも1時間くらいあれば解くことが出来るようになりました。

### 英語力
LeetCodeは英語or中国語専用のため、基本的には英語を読むことになります。この150日で英語力が向上した気がします。おそらく。

### 脳
解いてると脳をかなり使うので頭が良くなった気がします

# 慣れてきたらコンテストにも挑戦してみる
LeetCodeにある程度慣れてきたらコンテストに挑戦してみるのもおすすめです。
- Weekly Contest(毎週 日曜日11:30-13:00)
- Biweekly Contest(隔週 土曜日23:30-25:00)
の2種類があります。コンテスト参加者は半数以上が中国人で、その他世界中の人々が参加しています。日本人は3%くらいと言ったところでしょうか。

実際コンテストに参加してみると、自分の劣等感にさいなまれることになると思います。しかし、継続してコンテストに参加していると順位がどんどん上がっていって成長を実感できると思います。
私も4ヶ月ほど前の初挑戦のコンテストでは8000位(20000位中)とかを取ったりしていましたが、現在では最高570位くらいを記録するようになり、成長を数字で実感できます。

# おわりに
LeetCodeは、私の良い習慣として継続できているのでこれからも続けていきたいと思っています。
みなさんも1時間だけLeetCodeに時間を割いてアカウントを作成、問題を解いてみてはいかがでしょうか？きっとハマると思いますよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707111/a57a682e-301f-599c-31bb-aff956ff25bd.png)