見出し画像

アルゴリズム苦手マンが、半年でAtCoder青色になるまで

前回のARC108で、目標だった青に到達しました。1600ちょうど。色変ギリギリ芸人です。「noteではエンジニアっぽい記事はなるべく書かない!」と決めていたのですが、今回は特別ということで。

ところで、このレーティングのグラフに違和感を覚える人がいるかもしれません。何か文字小さくない? それについては最後に書きます(最後まで読んでねという圧力)。

なお、この記事を書いている間に、ABC184で水色に落ちている可能性があります。水色に落ちても、この記事は投稿されます...。

競プロ開始前のスペック

・色々つくってるエンジニア(社会人3年目)
・ド田舎出身なので、中学受験算数は未経験(見るからに苦手)
・高校数学はとても得意
・UT理系卒(やや情報系寄り)
一番成績の悪かった授業が「アルゴリズム」
・Python書ける、C++ちょっと書ける

ざっと要約すると「典型的な数学問題は得意だけど、パズル的な発想は完全に無理なエンジニア(Python書ける)」です。

「アルゴリズム」は、大学後期の授業で唯一「可」をとった授業です。トラウマです。なんで競プロ始めたんだろ。


最初にやったこと

E869120さんのこの記事を参考にし、100問の中からいくつかピックアップして問題を解きました。初学者に道筋を示してくれる記事は本当にありがたい。感謝です。

アルゴリズムを学ぶだけでなく、競プロの問題に早めに慣れることができました。大半の問題は初見では解けなかったので、解説を読みながらとにかく手を動かしました。

個人的には「学ぶ→実践」よりも「とにかく真似でもいいからやってみる→後で学んで理解」の方が効率がいいです(競プロに限らず)。大学時代にアルゴリズムの成績が悪かったのも、理論ばかり学んで実際に手を動かさなかったからなのかも。


以下、それ以降にやったことを順不同で書いていきます。★は自分にとっての役立ち度です。

青になるために必要なアルゴリズムとか、Pythonについて、とかは無限人が書いてるので割愛します。


★*(INF)  AtCoder Problemsで過去問演習

これが全てです。「量より質!」は確かにそうですが、最初はとにかく量をこなすのが重要です(虚無埋め以外)。

名前はないけどよく見る解法、あると思います。過去問演習でそれを身につけ、次に似たような問題にあったときに解けるようになっていると、脳汁ドバドバでます。

ちなみに、解いた問題はこんな感じ。

スクリーンショット 2020-11-22 22.33.55

成果
入青に必要な典型解法を身につけることができた


★★★ 基本アルゴリズムのライブラリ化

いつでもコピペして使えるように、書いて用意しておきました。LISやTSPなどの典型問題も。そのままコピペすることはせず、一度は自分で手を動かしながら理解しました。

また、二分探索(bisect_left, bisect_right)でいつも頭こんがらがるので、目的別にサンプルコードを用意しておいて、いつでも引き出せるようにしておきました。

用意したコード群は、VSCodeの左側に常に表示してあります。

成果
コーディングの効率が上がった


★★★ VSCodeのスニペット登録

標準入力など、よく使うコードはスニペット登録しておきました。例えば、"ii"と入力すると、

map(int, input().split())

と変換されるようにしてあります。

「def get_int() とか定義した方が良いのでは」との声もありそうですが、解答以外のコードをなるべく残したくないという謎のポリシーがあります。C++ではさすがにマクロ用意してますが、適当に括弧で囲んで折り畳めるようにしてあります(Macだと Command+K -> Commnad+1 で全部折りたためる)。

成果
コーディングの効率が上がった(2回目)


★★★ バチャコンへの参加

コンテスト慣れが足りていないと思い、バチャコンに参加しました。

具体的には、毎朝7:00~8:00の「あさかつ」、毎晩21:00~22:40の「くじかつ」の2つに合計50回くらい参加しました。開催者の方、ありがとうございます。

バチャコンの成果として、解ける問題を解くスピードが上がったような気がします。自分はまだまだF問題を解く力がないので、ここで早解きの練習ができたのはよかったです。

なお、E問題までを確実に早く解けるようになれば、F問題が解けなくても青には到達可能です(Fが水diffのときは解けないときついですが)。直近10回のABCで、A〜E 5完最速のパフォはこんな感じです。

画像2

成果
解けるレベルの問題を早く解けるようになった


★★ Codeforces参加

バチャコンで「前に解いた問題だ...」となることが増えたので、さらなるコンテスト慣れを求めてCodeforcesに参加しました。

AtCoderとはまた違った毛色の問題が出るので、純粋に面白いです。7回ほど参加しました。けど、健全な生活リズムとの両立が難しいので、なるべく参加しないよう我慢してます。システスが気になって眠れない。

スクリーンショット 2020-11-22 23.01.39

成果
Codeforcesの楽しさを知り、健全な生活リズムを失いかけている


★★ C++の習得

たまーに std::set / std::multiset をどうしても使いたい場面に遭遇します。そのときにさっとC++を書けるように準備しています。

また、昔から数学の問題をゴリ押しで解きがちなこともあり、Python/PyPyだと実行時間が厳しいことがありました。例えば、ABC182-E は自分の解法だとPython/PyPyでは通らず、C++で書き直すことで大怪我は逃れました。

スクリーンショット 2020-11-22 23.07.17

成果
・Pyだとキツそうな問題をC++で解くことで、大怪我を防げるようになった
・std::set, std::multiset での解法を思いついたとき、実装可能になった


★ PAST参加

無料だった第3回PASTを受検しました。乞食ですみません。

競プロを始めて3週間(茶色)でしたが、ギリギリ上級を取得できました。ここで「何ヶ月か続ければ水~青には確実にいけるだろう」と思えたのが、モチベーションの1つになりました。

スクリーンショット 2020-11-22 23.12.04

成果
コンテスト参加回数が少なくレートが低いとき、PASTでレート以上の結果が出たことでモチベーションが維持できた


★ Paizaスキルチェック

何となく気分転換にやってみました。けっこう面白かったです。緑〜水の人にとって、Sランク問題はちょうどいい難易度。1度しか提出できないという緊張感もGood。

問題を解くごとにpaizaレーティングが変動します。これがAtCoderのレーティングだったらな〜〜〜〜〜。

画像6

成果
自分が暖色コーダーになったと錯覚でき、良い気分転換になった


☆テキトーに語る(本題?)

最初のレートのグラフ、ちょっと違和感ないですか?
実は、正確なグラフはこちらです。

ダウンロード

最初のグラフは、JSをいじって最初の1点を消したものです。この点のせいでグラフが見にくいので。消したらなんかグラフが小さくなった(なぜ?)。

このグラフの通り、実は4年前に1度だけコンテスト(AGC001)に参加したことがあります。けど、参加して2日くらいでやめました


参加した理由は覚えてないのですが、やめた理由はなんとなく覚えています。当時は、参考になる情報(記事)が少なかったからです。

何から学べばいいかわからなかった自分は、なぜか逆元の勉強から始めてしまいました。結果、「10^9+7で割った余りを求めたくないわ...」と、やめてしまいました。


今では良質な過去問や解説記事がいっぱいあり、プログラミング初心者から経験者まで、簡単に楽しく入門できる環境が整っています。本当にありがたいです。

自分も、ただ楽しむだけでなく何か貢献したいな〜と思っています。社内に競プロ広げるとか。AtCoderでコンテスト開催経験のある企業で働いているのですが、社内SNSで「競技プログラミング」や「AtCoder」と検索しても1コメントしかヒットしません。由々しき事態です。

なんとなく漠然と、「青色になったら何らかのアクションを起こそうかな」と思っていました。青色になってしまいました。やらなければ...。


--- 

ここまで書いたところで、ABC184に参加してきました。結果は...

ダウンロード (4)

水色落ち回避しました。「翌日に水色に落ちました」というオチを狙っていたけど、残念ながら使えませんでした。


茶~緑: 1ヶ月、緑~水: 2ヶ月、水~青: 3ヶ月、くらいのペースで伸びてるので、4ヶ月後は黄色です。無理です。頑張ります。

読んでいただきありがとうございます! サポートいただければ、甘いもの食べて更にやる気だします。