AtCoder入茶まで半年かかった凡人がやったこと

こんにちは、Yuyoです。プログラマーになるべく、日々精進している人です。
先日のAtCoderという競技プログラミングコンテスト(通称競プロ）のサイトで、色が一番下の灰色から一つ上がって茶色になりました！
![ScreenShot 2024-05-13 13.57.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568092/074fb9bf-90de-75d4-3ee0-dceb48cd86fa.png)


そこで、今回は私が茶色になるまでにやったこと、普段問題を解いている環境、これからどうしていくかについて書いていきたいと思います。
また、前置きが少し長いので、私の取り組んだことについて、知りたい方は4から読むことをお勧めします。

# 目次
[1.AtCoderとは？](#1-AtCoderとは？)
[2.AtCoderのメリット・デメリット](#2-AtCoderのメリット・デメリット)
[3.使用してる言語・エディタ・便利機能](#3-使用してる言語・エディタ・便利機能)
[4.茶色になるまでにやっていたこと](#4-茶色になるまでにやっていたこと)
[5.これからやっていくこと](#5-これからやっていくこと)
[6.最後に](#6-最後に)

# 1. AtCoderとは？
まず、AtCoderを知らない方のために軽く説明させていただきます。
AtCoderとは、日本の競技プログラミングコンテストサイトを運営してる企業であり、
毎週土曜(たまに日曜にも）に競技プログラミングのコンテストを開催しています。

https://atcoder.jp/?lang=ja

競技プログラミングとは、制限時間の中で与えられた問題に対して、正しい解答が
出力できるようなプログラムを記述し、解答速度を競うものです。

例として、このような問題があります。

https://atcoder.jp/contests/abc347/tasks/abc347_a

もちろん、このようなプログラミング言語の基本機能を知っていれば、解けるような基本的な問題もあれば、高度なアルゴリズムを用いなければ解けないような問題も多々あります。それを解いていくのが楽しみの一つでもあります。

毎週参加者は1万人程度存在しており、年々その人口は増えています。
また、AtCoderはこのようなランク付けがあり、そのランクが上がっていくことで、自分の上達具合を楽しめるといった側面もあります。
参考リンク↓

https://info.atcoder.jp/overview/contest/rating

数学やプログラミングが好きな人は取り組んでみると楽しめるかと思いますし、パズルを解いたりするのが好きな人にもおすすめです！何も分からないけど、興味のある方はこちらのコンテンツから取り組んでみるのをお勧めします。一通り終わったら、毎週土曜9時から行われてるABC(AtCoder Beginner Contest)に参加してみましょう！
↓

https://atcoder.jp/contests/APG4b

https://atcoder.jp/contests/APG4bPython

https://atcoder.jp/contests/abs

# 2. AtCoderのメリット・デメリット
個人的なAtCoderをやっていて感じたメリットは次の4つになります。
1. コードを書く習慣が出来る
2. 言語仕様、プログラムの論理構造への理解が深められる
3. 単純なプログラムを書くことに慣れられる
4. アルゴリズム、データ構造を学ぶことで、問題をスムーズに解決する手段を得られる

まず、毎日競プロの問題を解くことで、自分の使用する言語でコードを書く習慣を付けることが出来ました。これにより、他の分野について学んだり、他のプログラムをスムーズに読めるようになったりと様々な効果を感じてます。

次に競プロの問題では、言語の組み込み関数やモデュールを使用することで、より楽に解けることも多々あります。また、問題の解説を読んだり、解く際に調べたりすることでそれらを自分の書きたいプログラムに流用できる場面が増え、出来ることの幅が広がりました。論理構造を読み解けるようになったことも、ソースコードを追って、どういったプログラムなのか理解しやすくなり理解力の向上につながりました。

そして、技術書を読んで得た知識を使って、簡単なプログラムを組んで、実験するのが以前よりスムーズになったので、知識のアウトプットがしやすくなり、定着がより良くなって良かったです。

最後に私自身がそこまで高度なアルゴリズム、データ構造をあまり学べていないので、説得力はないのですが、stack、que、dequeや累積和、グラフアルゴリズムを学んだことによって、問題の解決方法を増やせたのが嬉しく思ってます。

デメリットですが、個人的には無いと思ってます。
価値観や生活が競プロ中心になる可能性があるっていうのが人によってはデメリットになるかもしれません。
SNSの競プロ界隈の人を見ていると、毎週コンテストに参加していたり、常にアルゴリズムの話題などを呟いてる人もいて、中々にストイックな世界だなーと思うのですが、競プロの取り組み方は人それぞれなので、自分なりのペースで楽しめれば問題ないです。
ついて行くのが辛くなったら一旦離れてみて別のことをやれば良いと思います。カジュアルにやってる人にとっては、競プロはあくまでプログラミングを使った趣味の一部だと思うので。
後、SNSの有名な競プロ界隈の方々は本当に上澄みなので、凄い人もいるんだなーくらいに見ておくのがお勧めです。真に受けてると、メンタルやられかねません。

デメリットに関しては、正直好きなコンテンツにどこまで時間費やすかっていう所に帰着すると思うので、本当に人によるとしか言えないです。
メリットも、人によっては必要とならない場面もあるかと思いますが、プログラマーとしての基本的な能力を培えたり、維持できるツールとして競プロは便利なので、個人的にはとてもお勧めです。

# 3. 使用してる言語・エディタ・便利機能
使用言語はPython3(3.11.4)、エディタはvim(もしくはastroNvim)です。
元々、Linuxを少し齧ってたこともあり、ターミナル操作の便利さを手放せなくなってるので、基本ターミナルで大体完結してます。

便利機能なんですが、これは語れば長くなるので、別の記事でお話ししようと思います。
有志の方々がChromeの拡張機能やユーザースクリプト、CLIツールを作成されてるので、その中で自分に合うものを選んで使っていくのを強くお勧めします。この理由に関しては4の方で詳しくお話しします。
興味のある方向けに簡単にこちらのサイトをお勧めしておきます。
↓
https://kato-hiro.github.io/AtCoderClans/

# 4. 茶色になるまでにやっていたこと
本題まで長くなりましたが、お話ししていこうと思います。
私のやったことは、以下の4つになります。
1. Pythonをある程度使いこなせるようにする
2. 問題を解く環境、周囲の情報を得る環境を整える
3. 確実に解ける問題を素早く解けるように数をこなす
4. 出来る限り多くのコンテストに出場する

それぞれについて、詳しくお話ししていきます。
1.に関してですが、これは競プロを取り組む上で絶対に必要なことだと思います。
Pythonに限らず、自分の使う言語の基本的な入出力操作、四則演算、modの扱い、条件文の書き方、配列などの基本的なデータ構造の使い方にのみならず、組み込み関数の使い方や便利なモデュールの使い方は、調べながら覚えていって本番で出来る限り澱みなく扱えるレベルになった方が良いです。
調べて解けることは解けない事よりは遥かに良いですが、コンテスト本番では調べる行為がタイムロスになり、パフォーマンスの低下、強いてはレーティングの低下に繋がりかねません。
競プロは中学受験レベルの算数や高校レベルの数学、高度なアルゴリズムの知識を身につけた方が良いと聞きますが、それらに取り組む前段階で一度基礎を固めていった方が結果的に早くこれらの知識を扱いやすくなると私は考えてます。

2.は私が一番心がけてる事です。競プロを本格的に始めてから1ヶ月経った頃に、サイトの提出ページのエディタとコードテストを使うのが負担になってると気づき、現在はCLIツールやブラウザの拡張機能を駆使して、ターミナルから全ての工程をスムーズに行えるようにしています。これをやっただけで、パフォーマンスが体感50-100上がったと思います。解答時間は提出までの時間が採用されるので、問題読解→コードを書く→コードテスト→提出を全部ブラウザで行ってるとかなりの時間を取られるし、いちいちコードやテストケースをコピペするのも負荷がかかるので、拡張機能を使って楽にテストできるようにしたり、CLIツールを使って、コマンドでテストや提出を行えるようにした方が後々楽になるし、浮いた時間でより難易度の高い問題の考察の時間が取れるので、私個人としては環境整備は早いうちにやっておいた方が良いと思います。（もちろん自分が既に慣れている方法があるなら、それに越したことはないです！）
情報に関しても同様で、よく検索したり参照するサイトをブックマークバーに追加しておく、忘れがちな事をメモにまとめておくなどは時間の削減や忘れていた時の備えになります。
後日、これに関しては別の記事で言及したいと思います。

3.は個人的な能力を鑑みて、行なったことです。一応、数学が全く出来ないという訳ではないですが、他の優れた方々に比べれば、私の数学力は非常に低いものだと思います。(センター数学６割取れるか取れないレベル)
また、プログラミング能力の方も、昔から少しやっていたものの、個人的な理由でブランクがかなり空いていたので、ほとんど一から学ぶような状態でした。
そんな状態で、高難度の問題を解いたり、高度なアルゴリズムを学ぶことはかなり負荷をかけることになるし、モチベーションの低下に繋がりかねないと考えたので、とにかく簡単なものから問題演習をしていく事にしました。
現在の演習量はこのようになってます。
↓
![ScreenShot 2024-05-13 13.12.22（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568092/a14f598b-529d-ba6f-bba3-90bcb0199908.png)
![ScreenShot 2024-05-13 13.12.26（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568092/71502ea8-67eb-9abf-cc6e-5e06851f5448.png)

ABCのA問題とB問題を最新からとにかく埋めてます。たまにC問題も解いたりしてますが、解説ACだったり、難度の低い問題です。
しかし、低難度の問題を埋めたことで、基礎的な体力をつける事ができて、簡単な問題なら反射的に解けるようになったのは、結果的にパフォーマンスの向上に繋がって良かったと感じてます。
正直、競プロを始めた時は、もっと高度なアルゴリズムを学ばないといけない、数学力をもっと高くしないといけないなどやる事が色々あるように見えて混乱してたんですが、数回のコンテストに出場して、「現状の自分に出来る事はいかに確実に解ける問題を他の人より出来るだけ早く解くかだ。」と認識し、その分野を得意にすることに対して集中したのが功を成しました。

能力が高い人は、C問題やD問題の演習量を増やした方が早く成長出来るかもしれません。
ただ、自分と同じような人はA問題やB問題をとにかく解いていくという手法も提案しておきます。
基本的な考え方を、解説を通して学んでいくことが出来るので、それが後々効いてくると思います。

4.ですが、これは私が競プロ好きだからやってる事なんですが、基本的に緊急な用事、自身の体調不良がなければ必ず出場するようにしています。
理由としては、本番の時間制限の中で問題を解いていくことで自分の本当の実力を測れるから、リアルタイムで色んな人と戦えるのが楽しいと思ってるからです。

現在20回ほどRated参加してるんですが、毎週の結果を見て、自分の強みや弱点と向き合って、次の週の演習に活かしていけたり、得た知識を使って出てきた問題を緊張感を持ちながら解くのは、準備してテストをするのと同じような楽しさを感じられます。成人してしまうと、なかなかこういった機会は自分から積極的に作らないとないので、それが毎週固定のタイミングで用意されてるのは非常に有難いです。

後、コンテスト出場回数が少ないと実際の自分のレーティングと乖離してしまうので、そのラインをとりあえず超えておこうという気持ちもあって、10回超えるまでは積極的に参加してました。今はすっかり習慣となってます。
解いた問題に関して、SNSで他の参加者の人と解法や思考過程を話し合えるのも楽しみの一つです。

現在、私は競プロ用のDiscordサーバーを運営してますので、もし興味があればご参加してみてください。
人数は少ないですが、コンテスト終了後など活発に活動してます！
↓
https://discord.gg/5NKBjQTn72

# 5. これからやっていくこと
これからやっていくこととしては、
・残ってるABCのA・B問題を埋める
・C問題以上の問題に取り組む頻度を上げる。
・持っている競プロ関連の本の演習を進めていく
・算数や数学の力を少しずつ上げていく
ですね。
ここまで来るのも正直大変だったので時間はかかると思いますが、他の人たちがC問題以上の問題を解いてるのが競プロをより楽しめてる感じがして、すごい羨ましいので頑張りたいと思います！
緑色に辿り着けるのか分からないし、正直今週末にまた灰色へ戻る可能性もありますが、せっかくここまで継続できて、かつ楽しめるコンテンツに出会えてるので精進していきたいと思います。

# 6. 最後に
ここまでの長文、読んでいただきありがとうございました！
茶色になるのは、競プロを始めてから達成したい目標の一つだったので、今とても嬉しいです。
SNSでいつも関わってくださってる競プロ界隈の方々や
良質なコンテンツを定期的に供給してくださるAtCoder関係者の方々、
日頃自分を支えてくれている家族に感謝の念を込めてこの記事を締めさせていただきたいと思います。
また、Qiitaに記事を書いた際は読んでいただけると幸いです。機会がありましたらよろしくお願いいたします。

Yuyo

P.S. 後日、競プロの環境構築、競プロに便利な拡張機能、競プロを行うにあたって参考になった書物・記事についても記事を書こうと思ってます。
恐らく５月末くらいには出せるかと思いますので良ければ！