見出し画像

【緑色変】算数の教養がほとんどなかったプログラマがAtCoderを4年やって緑になれた話

こんばんみんみん。
バーチャル幼女プログラマーという肩書でインターネットをやっているきりみんちゃんというものです。

競技プログラミングのAtCoderというサービスに日々取り組んでいるんですが、この度めでたく緑レートになることが出来ました。
いわゆる色変エントリというやつです。

で、誰?

3年前にこんなエントリを書いた者です。

VTuberをやったり絵を描いたりしてる社会人エンジニアです。
専門分野はAndroidでしたが、最近はフルスタックエンジニアを目指してフロントエンドやバックエンドなどをやっています。

現在のAtCoderコミュニティの中心層は理系の学生やもともと数学がかなり好きなタイプの人たちです。
一方きりみんちゃんはプログラマでありながら数学にコンプレックスがあり、それどころか小学2年までしか義務教育を受けていないため、中学、高校レベルの基礎的な数学の教養が全くありませんでした。

そしてAtCoderが自分のように数学やアルゴリズムなどに苦手意識を持ってるエンジニアが数学やアルゴリズムを学び直すのにいい題材なんじゃないかなと感じ、問題に取り組むとともに布教活動をしたりしてきました。


そんな自分がAtCoderに真面目に取り組んでどうなったかというのを書いていきたいと思います。

ふりかえりとレート推移

色んな意味ですごいレートグラフ

長かった…。
1年目にレート750くらいまで上がったものの、その後コロナ禍のメンタル低迷とリンクするようにレートが落ち、一旦灰レートまで落ちました。
その後もメンタルやAtCoderのインフレに左右されながら上がったり下がったりして、2022年に一度緑直前まで行くも、また下がって、そこから体調を崩してしばらくお休みしたりして、満を持してようやく緑にたどり着くことが出来ました。
緑への色変エントリは多くありますが、ここまで長期間かけて紆余曲折の末に緑になったという人はあまり見ない気がしています。

緑のレベル感について

これは多くの人が色々な言及をしているテーマですが、自分が感じた緑レートというレベルについてです。

だいたい常に参照されるのはAtCoder社長のChokudaiさんのエントリです。

緑色になれれば、「競技プログラミングに熱心に取り組んでいる人」と考えて問題ないでしょう。要求レベルも決して低くなく、出場回数が足りないとマイナス補正がかかるため、運だけで到達することはまず出来ないラインです。他社アルゴリズム力判定サービスだと、上位1%の最高ランクが付く実力です。(あくまで「アルゴリズム力部分だけであることに注意してください)

印象としては、学生ならかなり優秀。
エンジニアとしてもある程度の安心感がある。論理的に複雑な処理の実装に対応できない、なんてことはなさそう、くらいには思える。データ量が多い現場など、計算量の多い処理が要求される現場でなければ、このレート帯以上を求める必要はほぼない。


くらいの印象です。もちろんアルゴリズム力しか計ってないので個人差があります。

技術的な部分では、if、forはもちろん、それを組み合わせて2次元配列に対して操作をしたり、深さ優先探索幅優先探索などのキューや再帰を使った実装も出来る。
簡単な動的計画法の問題や、数学的に工夫する問題など、計算量の工夫も出来始める。


という感じです。

変な言い方をすると、この文言に騙されて「まあ現役プログラマだし緑くらいにはすぐになれるやろ」と思って緑を目標に始めたところがあります。
しかし、実際にはこの基準は数学的素養がある人の話で、算数が苦手なきりみんちゃんにとっては緑は相当に高い目標でした。
更に教本や過去問などが増えたことなどにより、参加者の知識レベルもインフレが進んでおり、今では緑どころか茶レート帯でもかなり様々な複雑なアルゴリズムの知識が求められるようになっています。

肌感としてはきりみんちゃんが始めた4年前と比べて最低でも一色分はインフレしていると思っていて、実際には水色の説明である以下の文章が実態に近いんじゃないかなと思います。

水色はかなり優秀です。普通に企業とかで超優秀って言ってるプログラマが居た時に、半分くらいはこのランクになると思います。数学が得意なタイプだと、この一つの上の青色に行きますが。

半数以上のIT企業において、アルゴリズム能力についてはカンストと言えるでしょう。特にアルゴリズム的な能力を必要としない会社であれば、ここから上はレートを上げても実務に役立つ部分はほとんどありません。

技術的なスキルで言うと、計算量に関する感覚が体に染みついており、複雑な処理でも苦もなく実装出来る
深さ優先探索幅優先探索、順列の全列挙やパターンの全列挙などができる。そこから動的計画法やメモ化再帰などの計算量改善につなげることも多少出来る。
貪欲・DP・しゃくとり法・二分探索などの計算量を改善するテクニックをある程度使い分けることが出来る。
累積和やUnionFind(競プロ外ではDisjoint Set)などのデータ構造を使いこなすことが出来る。
ダイクストラ法やワーシャルフロイド法、クラスカル法などの、基本的なグラフアルゴリズムが扱える。木構造やグラフ構造に対して適切に処理を行うことが出来る。
一定以上の数学に関する素養がある。素数などの性質や、それを利用した素数判定や列挙、約数の列挙等、最小公倍数や最大公約数、組み合わせの計算など、競プロにありがちな典型数学問題に対処できる。


みたいな感じになります。水色になると急に要求水準が上がってるのは分かると思います。

実際、1年目に緑近くまでレートが上がった時と比べると、今の自分は比べ物にならないくらい多くの知識、経験が身についていると感じています。
とはいえ、直近ではあまりガチガチの数学問題の出題が少なくなっている印象があるので、その点では数学苦手勢にとっては楽になった面もある気がします。

勉強したこと

正直4年もやっているので、もう何をどう勉強してきたのかあんまり憶えていない部分も多いのですが、一応振り返ってみたいと思います。

過去問解き

ABCのC問題まではほとんど解きました。D問題も茶diffから緑diff下位のものはだいたい解いています。
とはいえ、直近はあまり精進(競プロ学習のこと)は出来ていなくて、主に毎週のコンテスト参加とその復習によって勉強しているという感じの状態でした。

典型アルゴリズムの学習

詳しく書くと長くなるので過去エントリを参考にして欲しいのですが、D問題までで出題されるようなアルゴリズム、データ構造は一通り学習しました。
算数、数学に関しても元々が0に近かったところから、それなりに勉強しました。それについては以下のエントリでも触れているので気になる方は参照してください。

読んだ本

出ているAtCoderの教本は一通り読みました。
改めて考えると競プロの教本はずいぶん増えたなぁと感じます。
1年目の時は競プロ初心者向けの教本はほとんどなかったわけで、そりゃインフレもするよなぁという気持ちです。
ちなみにE8さんのアルゴリズム×数学本と鉄則本では地味にレビュアーもやらせて頂きました。

感じたこと

AtCoderの成績はあくまでAtCoderという一つのゲームの成績でしかなく、エンジニアの能力全てを測れるものでは特にありませんが、とはいえやはりエンジニアとしてAtCoderで緑になれたことは一つの自信になるかなと思います。
実際、AtCoderをやることでコーディングの速度は上がった気がしますし、業務でのちょっと複雑な実装への耐性も上がったと思います。

うーん、なんかいざ緑に到達すると意外に何を書いたらいいのか分からないですね。長く掛かり過ぎたせいで、AtCoderへの愛憎感情みたいなものはだいぶ薄れてしまったようです。
その辺のことはだいたい最初に貼った過去エントリで書いてしまっているしね。

算数、数学の素養がないモグリの社会人プログラマでも時間をかけて勉強すれば緑になれるんだよということで、誰かの励みになれたら嬉しいな、と思うかな。

今後について

一旦目標を達成したので、一段落という気持ちではあります。
とはいえ毎週コンテストに出るのは純粋に楽しいので、今後も都合が合えば出続けると思いますし、最近はそれほど勉強に時間を取っていたわけでもないので特に何も変わらないかもしれません。

水色を目指したいという気持ちがなくもないですが、正直さすがに頭打ちかなーという気もしています。
欲を言えばレート1000くらいまで行けたら嬉しいですね。

最後に

今まで応援してくれたたくさんの方々、本当にありがとうございます!
今回の色変でもたくさんのお祝いのメッセージを頂き嬉しかったです。
きりみんちゃんが長いこと緑になれなくてモヤモヤさせてしまっていた方々、大変おまたせしました。

AtCoderに限らずいろんなことにチャレンジしたり学習したりする楽しさを少しでも伝えられたらなと思います。
まだまだ体調やメンタルは本調子じゃない部分もありますが、今後とも応援よろしくお願いします!

この記事が気に入ったらサポートをしてみませんか?