自己紹介
こんにちは。先日水色コーダーになった大学三年生です。言語はpython,始めたのは去年(2019年)の6月です。あまり文章を書くのが得意ではないのですが、最後まで見ていただければ幸いです。
競技プログラミングを始めた経緯
大学に入って情報系の勉強を始め、同年10月に基本情報、翌年の4月に応用情報を取り、次に何勉強しようかな~と考えていたところ、情報系でない友人がpythonで機械学習を独学で行っていたのを発見し、とんでもないな。と思いpythonの勉強を始めました。
当時はpythonという言語のことは知っていたのですが、具体的な文法は何も知らず、学校ではProcessingというあまり有名でない言語を学ばされていたため、すごく焦りを感じたのを覚えています。情報系でない学部の学生がプログラミングやりだしたら、自分たちの市場価値落ちるじゃん!となり、大急ぎで環境構築をし、文法の勉強を始めました。
ところが、inputは適当にできるがoutputする場面が全くなく、Progateなど、その他プログラミング勉強サイトを探してみましたが、しっくりくるものがなくどうしたものかなーと足踏みしていた時に、Twitterで友達が(上記の友達とは別)「競技プログラミングやらんの?」とリプライを飛ばしてきました。「なにそれ?」と冷静を装って返信をしました。
が、確実におもしろいだろ、僕はプログラミング大好きだし人と競うのも大好きなのに。速攻で検索をかけ、AtCoderを発見しました。
そこから競技プログラミングの沼にはまるまで時間は必要なかったです。問題を解く機械になりました。
#持っている知識
BFS、DFS、セグメントツリー、DP、二分探索、逆元、UnionFind、ダイクストラ、ワーシャルフロイドなどです。数学は受験で使ったので、最低限の知識はある状態です。ただ、正直なところ、水色になるために必要な知識としては、二分探索、BFS,DFSぐらいだと思います。あとは早く正確に解くことを意識すればたぶん行けます。この方法で青は無理です。
#水色になるまでにやったこと
結論としては、問題を解きまくりました。ただ、努力というものはいつでも向ける方向を間違えてはいけないと思っています。飽きるのが先か、結果を出すのが先かです。あなたが競技プログラミングに情熱を注いでいればいるほど、努力の仕方は考えなければいけません。問題を解きまくるにしても、意識しなければいけないことはいくつかあります。以下では、自分が意識していたことを言葉にしていきます。
知らないアルゴリズムはその場その場で覚える
人間は、今必要ないことはあまり覚えられません。逆に、今必要なことはすんなり入ってくることが多いです。つまり、今必要なアルゴリズムをその時に学ぶのが効率がいいと思っています。問題を解き、わからないアルゴリズムがあったときに、その問題を解くために、アルゴリズムを勉強しましょう。
蟻本などを読んでアルゴリズムをすべて覚えてから競技プログラミングをやるぞ!とかは多分辞めたほうがいいです。
絶対に実装する
問題を解いた後に、頭の中で出来たからと言って実装せずに次の問題へ進む方がいます。これも絶対にやめましょう。理由の一つ目としては、多分、実装できないからです。実装せずに飛ばす問題には実装が重い問題が多く、おそらく最後までバグなしで実装することは難しいでしょう。
二つ目に、効率の悪さです。問題を解くフェーズには二つあり、一つ目が考察。どのようなアルゴリズム、データ構造を使えばこの問題が解けるのかを考えるフェーズ、二つ目が実際にそれをコードへ落とし込むフェーズがあります。体感ですが、僕の周りには一つ目のフェーズはできても、二つ目のフェーズができない人が多いです。つまり、その部分の練習が足りていない人が多いということです。ぜひ実装しましょう。我々がやっているのは競技考察コンテストではありません。
類題を解く
何においてもそうですが、BFSができないのであればBFS、DPができないならDPの問題を解かないと出来るようになりません。当たり前ですね。
幸い問題に解説があるため、その問題を解くために必要な知識が記載されているはずです。自分ができなかった問題の類題をぜひ解きましょう。
逃げるの大事
解説読んでもわからない問題があれば一旦逃げましょう。先ほども書きましたが、飽きるのが先か、結果を出すのが先か、です。解説を読んでも理解できない問題が仮に理解できたとして、コンテスト中に解けるようになるのは早くて一ヶ月先、三ヶ月先の場合もあると思います。だったら、自分が読んで、理解できて、実装できる問題を確実にとる方が結果が出るのは絶対に早いです。自分の中で大切にしている言葉があり、プロゲーマー、梅原大吾さんの言葉で「ゲームに飽きたんじゃない、成長しないことに飽きたんです」という言葉があります。まず、自分で成長を実感できるのを最優先にしましょう。
コンテストにでよう
みなさん、今から100分集中して勉強できますか?と言われたときにYESと答えれる方はかなり少数だと思います。しかし、どうでしょう。コンテストに出た際、かなり神経が研ぎ澄まされてると思います。ありえないぐらい集中しているのではないでしょうか?毎週この密度の勉強をしてて、レートが上がらないはずが無いです。
また、コンテスト中に自分が解けなかった問題はかなり悔しさが残ります。普通に問題を解いているときとはまた違うモチベーションで問題が解けるため、かなりおすすめです。
身近に競える人を作ろう
僕の場合は先輩と教授でしたが、友達などでも後輩に負けたくないでもOKです。誰かと一緒にする競技プログラミングはとても楽しいですし、負けたときの悔しい感情は是非大切にしてください。
最後に
長くなりましたが、読んでいただきありがとうございました。新しい言語をやる際など、ぜひAtCoderを使うといいと思います。(AtCoderからお金は貰ってません)