AtCoderで入茶することができました【AtCoder】

初めて記事を投稿します。IPFactory所属1年生のK5h1n0と申します。
本記事は[IPFactory Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ipfactory)の6日目の記事として投稿しております。

今年の5月ごろ、その存在を知ってから積極的に取り組んできた競技プログラミング。私事にはなりますが、約半年かけて11月19日の[AtCoder Beginner Contest 278](https://atcoder.jp/contests/abc278)にて入茶を果たしたので、今回、入茶記事というものを書いてみようと思います。
この記事が少しでも競技プログラミングを始めたての人の参考になれば良いと思っています。特に、AtCoder Beginner Contestに参加して間もない方や、興味があってこれから参加する予定の方向けです。

<br>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982232/e79fd06a-da66-be45-6545-09e4279e2716.png" width="70%">

<br>

## 自分の背景
- 情報系の專門学校の1年生で、入学するまでは本格的なプログラミングをしたことがなかった
- 学校の授業でごくごく初歩的なアルゴリズムを習った
- 11月に基本情報技術者試験を受けて合格点に達した
- 文系で、高校範囲の数学にも苦手意識がある
- 競プロにはPythonで参加しているが、Pythonに触れたのも初めてだった

## 入茶とは
AtCoderという会社は競技プログラミングのコンテストを開催しており、自分がRated参加登録を行なったコンテストの終了後、その成績に応じてレーティング値が上下します。その値が一定の基準を上回ったり下回ったりすると実力を表す色が変化するのですが、今回、私は一番下の灰色から茶色へと色が変わったので「入茶」したことになります。
各色のレベルについては、AtCoder社長のブログ記事に詳細が載っています。

https://chokudai.hatenablog.com/entry/2019/02/11/155904

この記事から茶色のレベルについて言及がある部分を一部引用させていただくと、
>学生で茶色なら優秀だがエンジニアとしてはちょっと物足りない。派遣とかで来たエンジニアが茶色あれば一安心。

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

とのことで、エンジニアとして十分にやっていけるだけの力はまだまだ身に付いていませんが、コーディングするのに最低限必要な基礎があることの証明になるのかなと思っています。入茶は当初からの一つの目標だったので、達成できたことがとても嬉しいです。

## 今まで取り組んだこと
AtCoder社はレベル別に何種類かのコンテストを開催していますが、私はその中でも初心者向けのAtCoder Beginner Contest（以下、ABCという。）に毎週参加するようにしています。

レートを伸ばしたければ継続的な参加が必須だと思いますが、加えて、コンテスト時間外にも勉強をする必要があります。初心者が競プロの形式に慣れるためにも過去問を解くことは避けて通れないでしょう。そんなAtCoderの過去問を解く上で便利かつ素敵なAtCoder Problemsというサイトがあります。

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

過去の提出を一覧で表示することができたり、自分のレベルに合わせたおすすめの問題を推薦してくれたりするなど、機能が多彩です。
こちらのサイトにお世話になりながら、ABCの出題形式に慣れるため、暇な時間を見つけてはABCの過去問を解いてきました。

<br>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982232/15713485-61f2-9e83-14b1-668f3bd34cdb.png" width="70%">

<br>

私が過去問に解いていった順番についてですが、[第一回のABCのページ](https://atcoder.jp/contests/abc001/tasks/abc001_1)を見ると、新しいものから取り組むようにお勧めされます。ですので、私は最新回から遡っていく形で、A問題を解いていきました。ある程度慣れたらB、Cと同じ方法で解いていくのが良いと思います。時々、解説を読んでも分からないくらい難しい問題に遭遇しましたが、期間を置いてから再度挑戦するとすんなりAC（正答）となることもあったので、気にせずスキップする心持ちも重要かもしれません。

加えて、bit全探索や幅優先探索のような典型的なアルゴリズムを学んだ時は、それを用いる問題だけに焦点を当てて、難易度に関係なく複数の問題を一気に解いたりすることもありました。

##### 今まで取り組んだことまとめ
- ABCに毎週参加する
- ABCのA問題を最新回から遡って埋めていく
- 同じくB問題埋め
- 難易度が低めのC問題に挑戦する
- 初歩的なアルゴリズムの理解と、それを使って解ける問題を集中的に解く

## 考えていること
書きやすく理解しやすいと私が思っているPythonで競プロに臨んでいますが、プログラミング自体も初心者だったので、最初はA問題を解くのにも苦労しました。A問題やB問題で躓いていた頃は「何をすれば良いか分かっているが、それを言語で実装できない」状態が多かったです。上記の取り組みを経てそのようなことも少なくなりました。

しかし、最近入茶前後でまたレートが伸び悩んできています。現在は時間内にC問題が解けたり解けなかったりするくらいのレベルで、入力例では正解しても、提出するとWA（誤答）してしまうことがあります。TLEの頻度も高いです。
TLEとは、時間内にプログラムの実行が終わらなかった事によるある種の誤答です。AtCoderのコンテストには実行時間制限があり、これを超えるとTLEになってしまいます。C問題以降は問題文の通りに実装してもTLEになってしまうことが多く、計算量の工夫が求められるんです。

以上のことより、レートが上昇していたのは競技プログラミング的な思考力が上がっていったからと言うよりも、単にPythonでの記述に慣れていったからと表現する方が正しいかも知れないです。つまり、過去問を多く解いたことで単純な実装が幾分か早くなり、A問題とB問題の早解きだけで入茶したようなものだということです。AtCoder社長の言葉、「単純な問題を早く正確に実装」という所に該当するかと思います。
社長の言葉にある残りの2つ、典型的なアルゴリズムの知識と、数学的・論理的な思考力はまだまだ求められる水準に達していないと実感しています。
この記事を書くのにあたり、様々な方の入茶記事を読ませていただきましたが、数学的な基盤がしっかりと身に付いていると思われる方が参加回数たったの数回で難なく入茶しているのを目にしているので、今後はこの2つの力を伸ばしていくことに重点を置きたいです。

## おわりに
最後に、競プロはとても楽しいです。
- 自分の力に応じてレーティング値が上がっていくのを眺める楽しみ
- それが積み重なって色が変わった時の特別感
- ABC終了後の競プロ勢によるTwitterタイムラインの盛り上がり
- 周囲に競プロ参加している仲間がいれば、ボイスチャットで感想戦をするのもとても楽しい

自分自身が半年以上も継続的に取り組めたコンテンツは数少ないですし、楽しいのでこれからも続けていくと思います。これを読んでくださった方もちょっとこの世界に足を踏み入れてみませんか。

---
この記事は IPFactory Advent Calendar 2022 の 6 日目の記事です。

https://qiita.com/advent-calendar/2022/ipfactory

昨日、12月5日は先輩によるAtCoderのツールについての記事でした。コマンドで提出できたら便利そう……！

https://duglaser.dev/articles/vzoL4DbtO7BtZGFlecuk