学校の先生がatcoderで入茶した話

## はじめに
　時期が少し前になりますが、AtCoderで入茶できました。
![FmjCGS4aUAAdH1g.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1426862/dd156330-35f8-76d1-42f8-5d60afa079a0.jpeg)
　ここまでの精進の仕方を備忘録も兼ねて残しておこうと思います。ちなみにAtCoderではレートによって色分けされており以下のような分類となってます。
| レーティング | 色 |
|:-:|:-:|
| 2800+ | <font color="red">赤 |
| 2400-2799 | <font color="orange">橙 |
| 2000-2399 | <font color="DarkKhaki">黃 |
| 1600-1999 | <font color="blue">青 |
| 1200-1599 | <font color="DeepSkyBlue">水 |
| 800-1199 | <font color="green">緑 |
| 400-799 | <font color="chakor">茶 |
| 1-399 | <font color="gray">灰 |

　茶色のレベル感はAtCoder社社長の直大さんの記事から引用しておきます。
>　茶色になる条件は、Ratingが400以上になることです。茶色で保証できる実力ですが、正直、AtCoder内ではあまり高いレベルではありません。ただ、ここにたどり着く前に辞めてしまう人が多いので、十分にやる気がある人であるとは言えるでしょう。
>　なお、他社転職サイトと比較すると、このレーティングでも上位1~2%の最高ランクに到達出来る人が数割いるため、一般的には十分高いレベルであると言えます。個人的な印象としては、
>　
>- 情報系の学生が茶色であれば、ちゃんと勉強してるなって印象になる
>- 派遣で来たプログラマがAtCoder茶色だったら結構安心する
>- 茶色があればエンジニアとしてアルゴリズム面においての安心感があるかと言われたら、正直物足りない
>
>みたいな印象があります。

[AtCoder（競技プログラミング）の色・ランクと実力評価、問題例 - chokudaiのブログ](https://chokudai.hatenablog.com/entry/2019/02/11/155904)


## 自己紹介
　高校数学の教員をやってます。プログラミングは趣味でちょこちょこ触っていたんですが、競技プログラミングというものを知って「面白そう！」と始めてみました。エンジニア職にも興味があるので、一つ自分の基礎力を示すものになればという思いもあります。
　pythonを主に触っていたので、「文法はとりあえずわかるし、いけるっしょ！」と思っていました。あの頃の自分を殴りたいですね。簡単な文法はわかれど、しっかりと理解出来ていなかったので躓きまくりました…。


## 茶色になるための方針
最速で茶色になるのに考えられる方針としては2つあります。
- **A,B,C問題を出来る限り速く解く**
- **A,B,C,D問題を安定して解く**

　後者の4問安定までいくのは時間がかかるし勉強するものも増えるので、やはり前者の**3問最速**がオススメです。自分もこの方針を念頭に置いて過去問を解いていました。具体的には1問に取り組む時間を決めておいて制限時間を意識しながら練習しました。


## モチベーションUPのためにユーザースクリプトを入れよう
　兎にも角にもまず最初にユーザースクリプトを入れましょう。

#### [Tampermonkey](https://www.tampermonkey.net)
　ユーザースクリプトを実行するのに必須なものです。まず最初にインストールしましょう。

#### [AtCoder Easy Test v2](https://greasyfork.org/ja/scripts/433152-atcoder-easy-test-v2)

![スクリーンショット 2023-03-18 11.29.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1426862/6bdc8bfd-c658-87ea-918f-ca64722b6af3.png)

　アルゴリズムがサンプルに対して合ってるかどうかを１Clickで判定してくれます。個人的には、**これがあるだけでモチベーションと作業効率が爆上がりです。** 絶対`AC`（問題のテストケース全てクリアすること）してやろうという気になれるので競プロ始める方は入れましょう！このスクリプトの詳細は[AtCoder Easy Test を支える技術 - Qiita](https://qiita.com/magurofly/items/4b60dc02283e70230f71)を見てください。
　
　
　他にもかゆいところに手が届く素晴らしいユーザースクリプトが様々あります。是非調べてみてください。


## やったことと期間
　基本的には以下のようなことをやってました。問題を解くにあたっては、[**AtCoder Problems**]( https://kenkoooo.com/atcoder)というAtCoderの過去問一覧サイトがあるのでそちらを使ってます。難易度などのパラメータ別にまとめたり、自分の成績や頑張りを可視化出来たりと本当に素晴らしいサイトなので、是非使いましょう！

| やったこと | 期間（だいたい） |
|:-|:-:|
| B問題まで確実に解けるようひたすら問題を解く | １週間 |
| 計算量についての勉強 | ２〜３週間 |
| C問題集中特訓&主なアルゴリズムやデータ構造の勉強 | １ヶ月 |
| 茶色問題をdifficulty順に解く | １ヶ月 |


#### B問題まで確実に解けるようひたすら問題を解く
　まずは競プロに慣れるということでB問題までを確実に解けるようにしました。Bまでは文法の確認問題などの基礎が問われるので一つ自分の基礎力の指標になります。最初、やりたいことはわかるんだけど上手くコードに出来ないということが多かったです。


#### 計算量についての勉強
　ある程度基礎問が解けるようになってくると、C問題にも手を出し始めました。そうして問題を進めていくと、今度は解答を提出した際に`TLE`するものが出てきました。`TLE`とは**Time Limit Exceeded(実行制限時間超過)**　の略で、つまりはエラーです。競プロには実行時間制限というものがあり、制限時間内に自分の提出したアルゴリズムが解答を出力する必要があります。↓こんな感じに問題文に表記されています。
![スクリーンショット 2023-03-13 10.21.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1426862/9f7297fa-143f-a279-6499-81557f77c7c7.png)
　大体の問題は2sec、２秒と設定されていますね。ちなみにメモリの制限もあり、これをオーバーすることを`MLE`、**メモリ制限超過(Memory Limit Exceeded)** と言います。

　`TLE`を回避するにあたって、アルゴリズムの**計算量**というものを理解する必要があります。「うええなんか難しそう」と当初思ってやる気が起きなかったのですが、少しやってみると意外とシンプルで早く取り組んでおけばと思いました…。ここでは説明を省きますがこの記事の最後に参考にしていた先人たちのわかりやすい記事リンクを貼っておきますので、是非参考にしてみてください！


#### C問題集中特訓&主なアルゴリズムやデータ構造の勉強
　計算量もなんとなくわかってきたのでC問題だけをやるようにしていきました。[**AtCoder Problems**]( https://kenkoooo.com/atcoder)で最新の問題から順にCだけやっていく形です。しかしこの最新から順にというやり方は止めておけば良かったと思ってます。後述しますが、難易度順（difficulty順）の方が良いです。
　Cをやっていくに従って、今度は解答に必要なアルゴリズムがわかっておらず全く解けないということが多々起きました。「こんなアルゴリズムがあるのか〜考えた人すごいなぁ」と感心してばかりの時期です。これでは先に進まないと思い、勉強しました。自分が知ってるアルゴリズムやデータ構造で入茶に必要かなと感じたのは以下になります。

| 入茶に必要なアルゴリズム・データ構造 |
|:-:|
| bit全探索 |
| 二部探索 |
| 深さ優先探索（DFS） |
| 幅優先探索（BFS） |
| 素因数分解 |
| 約数全列挙 |
| 累積和 |

　**とにかく探索系はやっておきましょう！** 理解できれば解ける問題がぐっと増えます。


#### 茶diff問題をdifficulty順に解く
　C問題まで安定して解けてきたところで茶diff（難易度が茶色レート帯）問題に集中しました。[**AtCoder Problems**]( https://kenkoooo.com/atcoder)のTop画面からListタブを選択すると下にProblem Listというのがあります。ここでDifficulty Fromタブを選択し`400 - `というものを選択します。

![スクリーンショット 2023-03-15 10.11.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1426862/32c7fef4-34ce-7fd0-9629-8a6c45c7c088.png)

　その後、下のリストの`Difficulty`の項目をクリックし問題難易度を昇順にしていけば準備OKです。

![スクリーンショット 2023-03-15 10.11.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1426862/0aa33d15-9d8d-f923-edff-63b4a2e2d3e6.png)

　出てきた順に問題をガンガン解いていきましょう！この方法をとったことでかなり自分のレベルアップに繋がったという実感があるので是非やってみてください。


## わからないとき、出来るだけ考える？orすぐ解答をみる？
　過去問をやっていてわからない問題にぶつかるとき、設けた制限時間を超えてずっと考えてました。でも、そうすると貴重な練習時間を浪費していることに気づきました。制限時間までに解けなければ**すぐ解法を確認**しましょう。まずはアルゴリズムの書き方を覚えることが大事です。自分で書けなければすぐ真似すべし。


## おわりに
　なかなか最初は思うように解くことが出来ず、「こんな難しいの解けるようになるのか…？やっぱり頭の良い人だけ楽しめるものなのでは…？」なんて思ってました。でも、諦めるのも悔しかったので続けていたら少しずつ理解でき競プロというものに慣れていくことが出来ました。何事も続けて慣れていくことですね。今後は入緑目指して精進します。Twitterやっているので良ければ一緒に頑張りましょう！


## 参考にしてた記事
　競技プログラミングを始めて、右も左もわからないときにお世話になった記事をまとめてみました。良ければ参考までに。

### 経験者に学ぶ
* [【AtCoder】普通の人である私が緑になるまでにしたこと - Qiita](https://qiita.com/Kota-Y/items/396ab3c57830dad65cfb)
* [PythonでAtCoder青になるまで -Pythonで競プロやるときに気をつけること- - Qiita](https://qiita.com/Kentaro_okumura/items/a6917572756a2e3c0da9)

### 最初に知っておきたい知識
* [Pythonで競プロをしよう！〜入門者が知っておくべきTips〜](https://techblog.finatext.com/lets-do-competitive-programming-with-python-9c8b834769f6)
* [Pythonで"in list"から"in set"に変えただけで爆速になった件とその理由 - Qiita](https://qiita.com/kitadakyou/items/6f877edd263f097e78f4)
    - listがsetよりなぜ遅いのかめちゃくちゃわかりやすい
* [競プロでも使える Python の便利な標準ライブラリ Tips - Syakoo's Lab](https://syakoo-lab.com/writings/20210711#collections.deque)

### 最初に知っておきたい計算量
- [Pythonistaなら知らないと恥ずかしい計算量のはなし - Qiita](https://qiita.com/Hironsan/items/68161ee16b1c9d7b25fb)
- [計算量オーダーの求め方を総整理！ 〜 どこから log が出て来るか 〜 - Qiita](https://qiita.com/drken/items/872ebc3a2b5caaa4a0d0)

### C問題以上に立ち向かうため
* [貰う DP と配る DP | アルゴ式](https://algo-method.com/descriptions/78)
    * DP（動的計画法）は入茶のための優先順位が低いんですが、余力のある人はやっておいて損なし
* [2部グラフ判定問題 - 30歳で競プロに目覚めた霊長類のブログ](https://prd-xxx.hateblo.jp/entry/2017/10/13/004256)
    - 2部グラフとその実装がよく理解できた記事
* [アルゴリズムとデータ構造入門 | アルゴリズムロジック](https://algo-logic.info/beginner/)
    - アルゴリズムの理解にちょくちょくお世話になった