📝

茶停滞から緑までの言語化

2021/08/30に公開

AtCoderの精進実績


Background

  • 中学受験経験なし
  • 旧帝大文系卒 数学は大学入試で必要で配点も高かったので勉強はかなりしていた。卒業して12年ほどは数学を一切していないのでほとんど忘れている状況
  • 大学は非情報系
  • 職歴はソフトウェアエンジニア約3年、その他SE的なこと約5年
  • 新卒の研修でアルゴリズム的なことは少ししたものの、AtCoderではじめて本格的にアルゴリズムを勉強
  • 数学問は嫌いだけど素因数分解は許容派
  • 31歳でAtCoder開始

時系列別の振り返り

①自分の初期レート把握 2020年1月AtCoder開始から2020年3月まで

グラフでみたらわかりますが、茶の550付近まではほぼ一直線。ここでの精進は、ただ慣れるためにA,B,Cを適当に解いたぐらいで特にこのときは、どのアルゴリズムを勉強するべきか、といったこともわからない状況でしたので、ただコンテストを受けて、自分の持ちレート(特に何も意識せずに達することができるレート)がこの付近ということだと思います。ただ、この2020年1月-3月はおそらく今よりもレートが上がりやすいギリギリのタイミングだったと思いますので、今から始めてもおそらく同じようには上がらないと思います。AGCでたまたま1問解けたらレートがバク上がりするみたいな宝くじのようなことができたのも寄与しています。

②底レート確認、天井レート超えられない辛い時期 Streak維持のための2020年3月から2020年12月まで

去年からAtCoderをしている人ならわかると思うのですが、この時期ぐらいからかなり問題が難しくなり、精進をしてもその精進を外してくるような問題を毎回出してくる、という非常に辛い1年間だったと思います。例えば、小数点誤差だったり、小数点誤差だったり、小数点誤差だったり... AtCoderは未経験のC++で始めたのですが、C++だと非本質的なところでWAになり何が原因かわからず、考察の邪魔でしたので、はじめて半年ぐらい経ってからこれまた未経験のPythonに変えました。Pythonだと考察に集中できるから、非常に良いです。

ただ振り返ると、ここでなんでレートが思うように伸びなかったかというと、Streakを365日つなげるという愚行をしていたからです。灰dif1問でつないだり、Swiftを練習するために、Swiftで灰difを1問解いてSterakを繋ぐという、レート向上に寄与しない行動をしていたから、普段の精進はあってないようなものだったと思います。もし今現在、灰difでStreakをつないで、新しい問題を解くことがもったいないと思ったり、難しい問題は時間がかかるから、Streakつなぎのために積極的に取り組まないということがあるようでしたら今すぐStreakを繋ぐことはやめて、AC数であったり、RPSであったり、精進グラフを基準にするほうがいいです。たまにStreakを繋ぎながら、高難易度の問題を解き続ける人もいますが、大半の人には当てはまらないと思いますので、オススメしないです。別にUnique ACしなくてもAtCoder ProblemsのHeatmapはAll Submissionsで草は生えますし、解けなくてWAの提出だけでも、実績としてはやったことにはなるので、Unique ACにおけるStreakでのモチベーション維持をやめたらいいというだけです。

③レート向上に一番寄与した行動 2020年12月から2021年現在まで

365 Streakを切ったのはちょうど去年の12月なのですが、そこからMax Difficultyの色が変わっていることが一目瞭然です。レートの方を見ると、1月の後半から明らかに変化が出ているのがわかります。Streakを切って、緑dif中心で、最近では水difも中心に精進するようにしました。ただ、このときに、緑difをただ解いただけでレートに寄与したかというと、おそらくそうではなくて、以下の2つを意識したことが大きいのだと思っております。

1.アルゴリズムを覚えるという意識を捨て、考察を軸に問題を解くことに集中するよう、意識改革

色変記事はたくさんあり、色々読みましたが、このアルゴリズムを覚えました、といった記事がほとんどのように思います。しかし、問題を解いていたらわかるのですが、アルゴリズムを覚えていたらそのまま適用できる、というケースは少なくて、「問題を考察した結果、このアルゴリズムを適用すると、計算量を削減できるし解くことができる」 or 「考察した結果、このようなアルゴリズムが存在するかわからないが、こういうアルゴリズムがあれば解くことができる => Googleで調べてみる => あ、これが使えそうだ => AC」ということが、あるべき解答までの道筋だと気づきました。ようするにアルゴリズムありきではなくて、考察ありきということです。なので、問題を解くためにはまず、

  1. 問題を理解すること
  2. 問題を解くこと (ACするという意味ではなくて、問題を理解して、どのようにしたらACするかの道筋を立てること)
  3. 実際にコードを書いて実装すること

の3ステップを重要視しました。特に、はじめの2ステップが本質だと思っており、このステップの中に、なるべくアルゴリズムという言葉が出てこないようにしたほうがいいと思います。ようは、アルゴリズムを何も知らない状態で問題を理解し、解くことで、結果としてあるアルゴリズムを適用していた、という流れで問題に取り組むということです。

明らかに、考察パターンのほうが数が多いし大事であるのに、書籍では大体、アルゴリズムで目次が作られているのがあまり良いと思っていなく、考察パターンで目次を自分自身で作れるような精進の仕方をしたら良いと思います。典型アルゴリズムが12個としたら、其の裏に隠れている考察パターンは30以上はあると思っており、そちらを勉強するほうがよっぽど大事だと思います。アルゴリズムは考察の結果、自然と出てくる、といった位置づけにしたほうが良いです。アルゴリズムの数はそこまで多くないですし、アルゴリズムを意識しながら考察をすると、考察の妨げになります。ただ当然、アルゴリズム名は考察の過程でふわふわ登場してくるものですから、アルゴリズムを忘れろといいたいのではなく、軸に置かないほうが、より解答に近づくということです。

2.ロックアウト形式で同じレベル帯の人とランダムに適正難易度かそれより少し高い難易度の問題を1問、本番のコンテストのつもりで解いて、議論し、幅を広げる

こちらは、ロックアウトを一緒にできる仲間がいないと難しいのは事実ではありますが、正直この精進がないと、精進がレートに反映しにくいのではって、思っております。一般的な精進の方法として、例えば、bit全探索を身につけるために、bit全探索の問題を探し、それを解く、みたいなことをしている人がいると思いますが、其の方法はオススメしなく、本番のコンテストのように何を適用するかわからない状態で、ランダムに問題を抽出し、適正難易度 or 少しむずかしい問題を解くということをするのをオススメします。その結果、この問題を解くためにはbit全探索が必要だった、という学び方をしたほうが、考察力が付く上に、アルゴリズムの知識もつけることができます。また、複数問を同時に解くよりも1問のほうが集中できるし、議論する際に、片方の人が解いていなかったということが起きないので、個人的には1問を集中して考察するということをオススメします。

考察し、問題に向き合った結果、問題を解くにはこの考察 or アルゴリズムが必要だったんだ!という経験を繰り返すことでしか、自分の初期持ちレート以上の実力は向上しないと思っており、それを繰り返すことで、本番の未知の問題でも、「問題を考察し、理解し、解くこと」で、未知のアルゴリズムや知識として持っていて適用がしづらい問題だったとしても、ACに持っていく力をつけることができるのかなって思っております。また、1人で精進すると、思考に偏りが出てしまい、新たな気付きが得られにくいという問題があります。これを解決するには同じようなレベルの人や自分よりレベルの高い人と精進をし、解法を議論して、新たな視点を得るということが必要だと思います。

余談

  • モチベーション保つの難しくないですか
    モチベーションという概念を自分の人生からなくします。常に最悪の状況でも、少しでも進む状態を作り出します。例えば、1問ロックアウトを毎日し、それ以外はやる気があるときにプラスアルファで実施する等。これは仕事とかいろいろなことでも応用できます。はじめにやる気ある人は大概いなくなるというアレです。モチベーション無くても続くよう工夫します。

  • AtCoder以外に人生に大事なものがあるんだけど!?
    その大事なものを先に解決しましょう。それらを満たしてから、自己実現欲求を満たすために行うのがAtCoderだと思っております。

  • レートに一喜一憂してしまいます
    自分もします。その感情を受け入れたうえで、進むしかないです。かといってレートで何か決まるってことは考えすぎだと思います。自分は最近の転職活動では茶コーダーを大々的にアピールしましたが関係なく評価されました。

  • AtCoder以上に楽しいものがないんですがどうしたらいいですか
    そのままでいいと思います。長く続けることそれ自体に価値があると思っており、また、長く続けた先にしか発見できないものがあると思っております。

以上です。

Discussion