【AtCoder】入茶記事というものを書いてみた

みなさんこんにちは。uniです。

今回は、AtCoderという競技プログラミングで茶色になったので、学習期間とかもろもろ書いていこうと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/716184/43583e6b-bd97-c429-48d7-73bdb553051e.png)

## 自己紹介

- 情報系の大学生
- 競技プログラミング歴3ヶ月弱
- 使用言語Python

こちらがプロフィール。

https://atcoder.jp/users/uniTM

## 茶色のレベル感

茶色というのはどのくらいのレベル感なのか。AtCoderの社長の言葉をお借りします。

> 茶色になる条件は、Ratingが400以上になることです。茶色で保証できる実力ですが、正直、AtCoder内ではあまり高いレベルではありません。ただ、ここにたどり着く前に辞めてしまう人が多いので、十分にやる気がある人であるとは言えるでしょう。

> なお、他社転職サイトと比較すると、このレーティングでも上位1~2%の最高ランクに到達出来る人が数割いるため、一般的には十分高いレベルであると言えます。

> 個人的な印象としては、

> 情報系の学生が茶色であれば、ちゃんと勉強してるなって印象になる
派遣で来たプログラマがAtCoder茶色だったら結構安心する
茶色があればエンジニアとしてアルゴリズム面においての安心感があるかと言われたら、正直物足りない
みたいな印象があります。スキル的に確実に保証出来る点は、

> 標準入出力、if、forなどの単純な操作はできる
問題文を正しく理解し、計算量を考えない仕様通りの実装をすることが出来る
の２点です。ただし、完全に上の能力しか持っていないと茶色になることはできず、

> MARCH理系学部以上に入れる程度の数学力や論理的思考力があり、数学的な工夫が必要な問題を正解出来る
典型アルゴリズムに関する知識を多く持ち、探索による全列挙や単純な動的計画法など、典型的な問題に正解することが出来る。
コーディングや読解速度が早く、単純な問題を早く正確に実装することが出来る
などの特徴を持っていなければ、茶色になることはできません。このレート帯に達する人は本当にバラバラなので、保証出来る点は少ないですが、何かしらの強みを持っていなければ、茶色に到達することはできません。

> もちろん、保証出来る点が少ないと言っても、コーディング試験でおなじみFizzBuzzなんかは全員が当然一瞬で組める水準です。

ざっくりいうと**プログラミング言語の基礎は掴んできたよね**くらいのレベルです。

## 茶色になるまでにやったこと

私が、茶色になるまでにやったことを重要度別に説明していきます。

| やったこと | 期間 | 重要度 |
|:-:|:-:|:-:|
| 毎週ABCに参加  |  X | **高**  |
| 過去問AB埋め  | 3ヶ月弱  | **高**  |
| 過去問C解き  | 1ヶ月弱  | 低  |
| AOJ プログラミング入門 | 1ヶ月弱 | 中 |
| タイピング（寿司打、e-typing）|ほぼ毎日| **高**  |

### 毎週ABCに参加

これは、重要度高です。特に毎週参加するということが大切です。

例えば、時間があるときだけ参加する、みたいにしていると、気づいたらAtCoderの存在を忘れています。また、まったく問題の傾向になれることができません。

毎週参加することのメリットは以下のとおりです。

- 問題の傾向に慣れることができる
- モチベーションにつながる
- プログラミングすることが習慣化する
- 土日の夜を有意義な時間にできる

また、参加したABCの復習（AC・WAした問題）もかかさず行うようにしましょう。

### 過去問AB埋め

これも重要度が高いです。先程も述べましたが、やはりコンテストの傾向と形式を把握することが大切です。

例えば、闇雲にC++入門とかPython入門とかの書籍やサイトを繰り返していても、競技プログラミングになれることはできません。`map(int, input().split())`や`[int(input()) for _ in range(n)]`など、競技プログラミング独特の書き方があります。これらになれないと、どれだけ時間が経っても、入門者を脱却できません。

AB埋め、といいましたが、全部する必要はありません。1日何問やる、1日1時間やると、計画的に勧めていくことが大切です。

過去問に関しては、以下のサイトを使うことで、効率的な学習をすることができます。

https://kenkoooo.com/atcoder/#/table/

### 過去問C解き

過去問C解きは、あまり重要度が高くありません。
なぜならC問題を完璧にとけなくても、茶色になれるからです。

参考に私の問題別グラフを載せておきますが、あまりといていないことがわかります。（大半が過去問ではなく、コンテスト中に解いた問題やつまみ食いした問題。）

茶色になるために重要なことは（後にも述べますが）、**どれだけ早くAB問題を解くことができるかです。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/716184/061d8103-fcb5-c52d-65a0-55de1fc8f492.png)

### AOJ プログラミング入門

https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/1

AOJ プログラミング入門は、Pythonの基礎を学習するためにやりましたが、そこまで重要ではないと考えています。

利点としては、AtCoderの感覚で、各言語（C++やPythonなど）の基本のきを学習することができることです。

「プログラミングなんてやったことない！」というかたは、AB埋めに入る前に一通りやっておくと良いかもしれません。基礎がわかっている方には不要です。

### タイピング（寿司打、e-typing）

https://www.e-typing.ne.jp/

http://typingx0.net/sushida/

タイピングは、重要度が高いです。

結局茶色になるためには、どれだけAB問題を速く解けるかが問題になってくるので、タイピングが速いほうが圧倒的に有利です。また、AtCoderだけではなく、普段パソコンを使う人は、やっておいて損はないと思います。

目標としては、**タッチタイピング**、**4.0wpm以上**を目指すと良いと思います。

## おまけ：使用言語について

私の使用言語は、Python3です。

なぜPython3を選んだのかというと、次のとおりです。

- 直感的に理解できる
- （公式・ユーザー）解説記事が豊富
- 使用ユーザーが多い
- 競技プログラミング以外にもできることが多い
- （授業で使っているから）

特に、直感的に理解できるという点が大きいと思います。

AtCoderでは、C++という言語が最も使われています。理由は、計算速度が高速、ライブラリが豊富、公式解説がC++、など、様々なメリットがあります。

しかし、大きなデメリットとしては、**理解するのに時間がかかる**という点です。したがって、「競技プログラミングをする」のではなく、「C++という言語を理解する」という方に時間を多く費やしてしまいます。

その点、Pythonという言語は、学校教育に使用されるほど、わかりやすい言語です。どうしてもC++をしたい、という場合でもPythonから始めることをおすすめします。Pythonである程度プログラミングを理解してから、途中でC++に変更する、というやり方がベストだと思います。

C++は下記のサイトで効率的に学習することができます。

https://atcoder.jp/contests/APG4b/tasks_print

結論、私はPythonを使うことをおすすめしたいです。

## まとめ：茶色になってやっとスタートライン

AtCoderは、茶色になるまでに挫折してしまう人がほとんどです。
ですので、今回の記事を参考に、みなさんが茶色になっていただけると幸いです。