競技プログラミングとは何ぞや
そもそも競技プログラミングとは何ぞや?という質問に答えると、与えられた問題をプログラミングを使って時間内に解くという感じのもの。つまり、プログラミングに競技性を加えたものというイメージ。そのまんまです。
やってみるとわかるのだが、とても難しい。
ただ課題に答えるだけのプログラムを組むだけならできる問題も少なくないが、プログラムの実行時間にも制約がある(何秒で処理を終えろみたいな感じ。時間内に処理が終わらないと不正解)ので、より効率よく処理ができるようなプログラムを組む必要がある。これがとても難しい。
AtCoderとは何ぞや
日本における競技プログラミングで代表的なサービスといえばAtCoderと言っても過言ではない。
日本で競技プログラミングをやろっかなって思ったらたぶんココ。
自分の好きなプログラミング言語で問題を解けるので、深く考えずにやってみるといいかも。
このAtCoderでは色でランク付けがされており、上から順に赤、橙、黄色、青、水色、緑、茶色、灰色、黒となっている。順にみると一番下のランクは黒だが、これはAtCoderに登録だけして一度もコンテストに参加していない人なので、実質的に一番下のランクは灰色と言える。
ランクごとの詳しいレベル感についてはAtCoderの社長が書いたこの記事を見てもらえればいいと思う。
お気づきの方もいるかもしれないが、タイトルの「灰色コーダー」というのはこのAtCoderにおける灰色のことである。
現在の僕は上の画像のような感じ。現時点での僕はAtCoderというヒエラルキーの中で一番下の灰色だが、半年後くらいには茶色になりたい。
AtCoderへの登録の方法などはこの記事では省くが、こちらの「レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【初級編:競プロを始めよう】」がとてもわかりやすい。こちらの記事を書いた方はなんとAtCoderで一番上のランクの赤らしい。僕もこの記事を読んでAtCoderを始めた。そして、この記事のタイトルをパク......オマージュした。
AtCoderの難易度
AtCoderではAtCoder Beginner Contest(通称ABC)、AtCoder Regular Contest(通称ARC)、AtCoder Grand Contest(通称AGC)のザックリ3種類のコンテストがある。実際には他にもあったりするがここでは語らない。
もっと言うと、僕がやったことがあるのがほぼABCだけなのでABCについて解説する。
ABCでは難易度A~Hまで8種類の問題が出され、それを基本的には毎週土曜日(たまに日曜日だったりする)21:00~22:40に開催されるコンテストでどれだけ正解できるかを競う。
問題の難易度は以下のような感じ(僕の主観に因ります)。
A問題
標準入力を受け取ることができれば正解できそう。競技プログラミングでは標準入力を受け取るところが最初のつまずきポイントな気がする。僕はめちゃくちゃにつまずいた。
B問題
Aよりもちょっぴり難しい。使用する言語の文法をある程度分かっていれば正解できそう。
C問題
Bに比べて難易度が跳ね上がる。ここがたぶん初心者の壁だと思う。
この辺から競技プログラミング!っていう感じが徐々にしてくる。たまにしか解けない。
D問題
Cよりもさらに難しくなる。このあたりからは問題文を理解するのに苦しみだす。
数学的な素養がないと解けないのかも。解けたことが無い。
E問題
たぶん数学ができないとできないんじゃないかな。知らないけど。
F問題
ちょっと何いってるかわからない
G問題
かなり何いってるかわからない
H問題
縺懊s縺懊s菴輔>縺」縺ヲ繧九°繧上°繧峨s
ちなみにARCにも一度だけ参加してみたが、1問も解けずに終わった。
全然Regular(通常)じゃなかった。
競技プログラミングのメリット
僕が考える競技プログラミングの主要なメリットはザックリ次の2つかなと思う。
- プログラミング力が身に付く
- 就職に役立つ
プログラミング力が身に付く
まず、これについては説明するまでもないとは思うが実際に身に付く。
恐らく実務で使うスキルとは少し方向が違うかもしれないが、与えられた課題に対してどんなアプローチが適切なのか、どんなメソッドを使えばいいのか考える力は必然的に磨かれるし業務でも役に立つと思う。実務したことないけど。
僕はPythonで競技プログラミングをするのだが、競技プログラミングをしていく中でPythonを以前よりかは理解できるようになった(と信じたい)。ちなみに、競技プログラミングではC++が主流。次点でPythonらしい。
就職に役立つ
直接的に役立つのは競技プログラミングでブイブイ言わせている人だとは思うが、間接的にはエンジニアを目指している人は全員役立ちそう。
まず、プログラミング力が身に付くという点で就職に役立つと言えなくはないし、もっと具体的な例で言うとコーディングテストで役立つ。
IT系の企業のインターンや選考ではコーディングテストがあることも珍しくない。そこで、競技プログラミングを経験していればそこそこ回答できるように感じた。
逆に、競技プログラミングをやったことがないと標準入力の受け取り方がわからなくて何もできずにジ・エンドとなる可能性が高い。実際に夏期インターン in 2021でそうなった僕が言うのだから間違いない。
大学とかで学習するプログラミングでは標準入力を受け取るというプログラミングを組む機会はそうない気がする。
なので、早いうちから競技プログラミングで慣らしておいて損はないなぁというのが正直な感想。
僕ももっと早くからやっておけばよかった。