はじめに
AtCoderと呼ばれるアルゴリズム力、プログラミング力を競うコンテストがあり、そこで「8割以上のIT企業でアルゴリズム力はカンスト」と呼ばれる青ランクになることができました。
記念に、AtCoderで緑~青ランクを目指す人向けに自分がこれまでどのようにやって来たか記事(色変記事)を書く事にしました。
私は始めてから青になるまで5年もかけていますし、卒論や院試、なんとなくやる気がないときなどは一切AtCoderをやらず、他にやりたいことと折り合いをつけながらこの1年やって来ました。そういう方の参考になればと思います。
私のAtCoder経歴
大学入学と共に真面目なプログラミングに出会い、競技プログラミングをはじめました。1年間で緑になりました。そこから3年間やらず、去年の夏ごろから復帰して1年位かけて青になりました。
AtCoderは難しくなった!?
3年間のタイムスリップをした私が、その3年間でどう変わったか述べてみようと思います。
問題が難しくなった?
- Yesだと思っています。4年前の私が緑だった時のことですが、私はソートとかをなんとか理解したぐらいで、2分探索も怪しく、木には植物のイメージしかありませんでした。しかし、今は木やグラフで茶色とかもあります。
- 私ができるのは緑同士の比較であって、それ以外は分かりません。
AtCoderは難しくなった?
- じゃあAtCoderは昔よりレートがあげにくいのかというと、そうではない気もしています。
- 私の知る限り、2019年ごろは今より圧倒的に情報が不足していたように感じます。本は蟻本位しかなく、解説記事も所謂「ガチ勢」みたいな人が書いたものばかりだった記憶です。当時の私も、「提出済みのコードを読む」みたいな勉強ばかりしていました。
- 今はたくさんの人のおかげで、勉強が凄くやりやすくなっているのではないでしょうか。初心者向けに書かれた分かりやすいコード、解説記事、ライブラリが沢山あり、少ない労力で昔の緑の問題を解く力がつくようになっているのではないでしょうか。
- であれば、むしろ今は昔より「AtCoderをやるべき時代」なのかもしれません。
- あくまで私の感想ですので悪しからず。
私のAtCoder戦略
やらないときはやらない。
- 毎日streakをつなげるタイプの人とかも居ますが、正直、研究とかバイトとか、その他にやりたいことがあるときにAtCoderやってられんなぁという気持ちです。Longest streakよりもStreak Sumの方が大事なんじゃないでしょうか。気楽に行きましょう。
やるときはやる。
-
バーチャルコンテストに出る
-
私はまよコンというコンテストに出ていました。毎日安定してコンテストを供給して下さっているので本当にありがたいです。
- 何を精進するかに迷うのも大変ですし、「精進するときはこれを使うんだ」と決まってるのは楽ですね。
-
一色上がいいとか、早解き力を高めるために一色下をとか色々考えましたが、まぁ何やっても力になる気がします。
-
-
できるだけ万全の状態でコンテストに出る
-
その日の心身の体調は結果に影響を与えている気がします。
-
去年ボカロのライブ帰りに30分遅れぐらいで無理してコンテストに出たのですが、ガチでマジの爆死をしました。以降気を付けています。
-
最近はVR瞑想にハマっています。コンテスト前にメンタルを整えるのにおすすめです。
-
-
ARC、AGCを対策し積極的に出る
-
「私にはARC、AGCは無理。」そう思っていませんか?
-
勿論向き不向きはあります。しかし、ABCは何百問もACしているのに、ARC,AGCは数十AC位のほぼ無対策な状況で、「私にはARC、AGCは無理。」っていうのは違うような気がしています。
-
ちゃんと勉強すると、できるようになって楽しいし、レートも上がるかもしれません。
-
サボるところはサボる。
-
とはいえ、私は折り合い系ゆるふわ競プロerの身。少ない労力で高い価値を得たかったです。色変記事を読む人の中にも、そういう方法がないかと思って読みに来ている人もいるのではないでしょうか。そこで、私が人よりサボってるかなと思われるものを紹介します。
-
問題の考察は楽しいのですが、それと比較してコードの実装は比較的興味が薄かったので、実装力はあまり高めませんでした。
-
ライブラリの自作などはしていません。人が作ったものを使っています。特に、菜さんのスニペットを良く使っていました。
-
コードの多くをCopilotで錬成しています。
-
デバッグにもあまり時間を使いませんでした。 Dropboxにテストが上がってるときは必ず使っていましたし、ないときはテストを自作して、テストでデバッグしていました。
-
こんな感じでchat-gptにアルゴリズムの要件を説明して方針を聞いたりしていました。
- 下の例は「集合Aと集合Bからそれぞれ要素を取り出しその和を大きい順に取り出す方法」を聞いた例です。(ABC297,8)
- 要件について考えるのも勉強になるような?
- しかし、下の例でもそうですが「微妙に間違ってる」タイプの嘘が含まれていることが多いです。今のところ方針を聞いて、詰めるのは自分でやる感じですね。
- 下の例は「集合Aと集合Bからそれぞれ要素を取り出しその和を大きい順に取り出す方法」を聞いた例です。(ABC297,8)
-
- インターンの面接では(特に外資系の会社)、copilotやchat-gptなどを一切封じられることが多く、スニペットも使えないことが多いです。就活とかに使いたい人にこういうやり方は向かないなぁと思います。
精進
- 最初に始めた時は灰や茶を解いていました。
- 復帰してからは前述の通りまよコンを中心に精進していました。
- 疲れている等は実装をせず、「問題文を読んで解法だけ考える」的な参加をしばしばしていたため、実際はもう1,2割位解いていると思います。
- 緑の時はまよコンのD問題(緑)、水色の時はまよコンのE問題(水)を主に解いていました。
- 精進自体を目標にするのも悪くないとは思いますが、自分はコンテスト中に解けるのか意識するようにしていました。
考える精進:どういうときそのデータ構造に落とし込めるのか
-
私も色変記事を色々読んでおり、そこに「覚えたデータ構造」みたいなものを良く見ました。しかし、これが私にはあまり役に立たなくてずっと不満でした。「緑色になるまでにDFS、ダイクストラ、クラスカルをやりました!」みたいな感じで書いてあることが往々にしてあるのですが、データ構造について覚えることにあまり意味がなかったように感じています。
-
その代わりに、そもそも「どういうときそのデータ構造に落とし込めるのか」ということを考えるようにしていました。
-
例えばDPを、「状態があまり多くなく、ある状態が求めやすい状態''のみ''から決まる法」と呼んでいます。「ある状態が求めやすい状態''のみ'から決まる」というのはどういうことかというと、DP[x+1] がDP[x]のみから決まったり、DP[x+1][y+1]がΣ[y=1,N] DP[x][y] で求まる時など、求めやすい = 計算量が低いという感じですかね。
-
ダイクストラとか、クラスカルとかも結局DPだったり貪欲だったりといったその背後にある抽象的なものに焦点を当てて覚えるのが良い気がしています。
-
ちょっと偉そうなこと言ってますが、私はDPがめっちゃ苦手で、苦手なりにもがいた結果こう思っています。
-
-
実はただのポエムで何の本質的な意味もないセクションだったかもしれない。
終わりに
ゆる系とつけたタイトルが人を傷つけないか少し不安なのですが、「好きなことだけで、やれる分だけで競プロやろうぜ」的な感じに捉えてもらえると幸いです。
一緒に勉強した友人達、まよコンや競プロVRCの方々、競技プログラミングの解説記事を書いてくれている方々、解法をtwitterに流してくれる方々に深く感謝します。
皆さんも良い競プロライフを~