0.はじめに
昨日のパナソニックプログラミングコンテストで無事緑になったった。何とか3月末までに緑という目標を前倒しで実現できた。
BとCでWA出た時は爆死が脳裏をよぎったけど、例外処理と精度の問題であると仮説を立てて修正しきれた時は成長を感じた。マジ危なかった
ということで成長記録を含めてやってきたこととこれからの戦略をメモ
まとめ
- 緑になることが最終目標ならC問題までの早解きで十分対応可能
- 水色が視野に入っているならアルゴリズムにも手を出していくべき
- 爆死は減らそう。
1.スペック
- 工学系博士。ただし計算機系ではない。毎日エッペンチューブを振っていた
- 仕事も計算機系じゃない。もの作って壊してを繰り返している。
- 使用言語はPython 昔はPHPとか触っていたけど今は全く触っていない
- プログラミングの授業でforとかifとかは書ける
2.灰色→茶色でやったこと:コンテストに出る
灰色から茶色は特に詰まらなかった。一度だけAB問題でWA連発して爆死したこともあったけどその他は特に問題なく茶色になれた。
意識していたことは、AB問題を早く・確実に解くということだった。パナソニックプログラミングコンテストで見てみると、AB問題だけを大体20分で解けば600程度は出る。なので焦らず確実にBを解いて茶色のスコアを出して、あわよくばCを解いてパフォーマンスを上乗せするという戦略が有効だろうと思う。
3.茶色→緑でやったこと(前半):爆死を減らす
茶色に上がった後はグロービスなどで忙しくて三か月ほどプログラミングを触れなかった。そのあとにまた出始めた時に意識したのはとにかく爆死を減らすことだった。
茶色まで上がる時には爆死の定義は「ABでWA連発」だった。だけれど緑を目指す際、パフォーマンスの傾向を見ていると爆死の定義を一段上げて、「3完できないこと」ととして、とにかくC問題に慣れるようにした。
C問題の傾向としては、計算量を落とさないとTLEが出てしまうという問題構成が多かったと思うのでとにかく10^7回の計算量を意識するようにしていた。実際効果はあったようで茶色上がってから緑になるまでは爆死によるレート低下は特に無かった。
4.茶色→緑でやったこと(後半):アルゴリズムの勉強
茶色上位になるとC問題まで解いてもなかなか上がらなくなるので、D問題の打率を上げることでレートが増加する可能性を高めていった。
D問題の流れとして多いのは考察→アルゴリズムを選択→実装ということなのでここで蟻本などを見ながらDPとかをかじるようになった。実際緑になるだけならいらないかもしれないけど、あればより盤石になるだろうと判断して、出たD問題については解けないまでも考察するようにした。実際最近ではD問題に手も足も出ないということは少なくなった(時間内に解けるとは言っていない)
少なくとも自分が参加したコンテストだけはDまで見てみると決めてしまうのもいいかもしれない。
ついでに100点問題全部埋めもやって爆死の頻度を減らした。ただそこまでやる必要があったかは疑問。途中から虚無だったかも。
4.これから:緑→水色になるための道のり
ここで書いたことをやっていけばいいかなと思う。
- 数学的考察の強化→数解いて慣れる
- アルゴリズムの知識強化→過去問
- 実装力→写経
- テストケース生成→なんか探す。たぶんネットに転がっているだろう。たぶん
具体的な行動としては300400点問題埋めかなぁ。200点は暇なときにでも。
アルゴリズムは過去の水色なりましたという投稿を見てそれを埋めていこう。
5.最後に
仕事にほぼ活きないのは分かっていたけれど、それでもAtcoderをやれた理由は「達成感がレーティングで目に見えて分かりやすいから」という点が大きかったと思う。
直接は活きないけれど学び方とか戦略は活きるって信じていられたこともでかい。プログラミングは直接は活きないけれど、目標を達成するための戦略の立て方と考えるとかなり汎用性は高そうじゃん?