AtCoderで競技プログラミングというものに触れて1ヶ月が経った

はじめに

競技プログラミングというものは言葉としては知っていました。
それらしきものとしてAOJProject Eulerにほんの少しだけ触れたこともあります。
しかし、ちゃんと勉強して継続的にやったことはありませんでした。

そんな中、ちょうど2019年の2月からAtCoder競技プログラミングを始めて、飽きずに1ヶ月が経ったので、自分にプレッシャーをかけるためにアウトプットします。

そもそも、なんで始めたかはよく覚えていないのですが、おそらく暇だったからだと思います。
モンハンもスプラトゥーンスマブラもやらなくなり、読みたい本もなく、持て余してたときにパズル感覚で始めたのがキッカケだったと思います。

現状

現時点(2019/03/17)での数字は以下の通りです。

項目 結果
順位 10317th
Rating 514 (暫定)
コンテスト参加回数 3
Accepted 125
Rated Point Sum 24100
Longest Streak 35 days

f:id:ohshige:20190317233640p:plain:w500

f:id:ohshige:20190317233657p:plain:w500

f:id:ohshige:20190317233714p:plain:w500

1ヶ月でコンテストに3回参加できたのは良かったなと思います。
ABCの過去問を毎日解くようにしていますが、やっぱりコンテンストに参加してレーティングをあげていきたいと思っています。
そのため、コンテストとの予定が合わないとかなり悲しいです。

また、Streakを伸ばしていくのもかなりのモチベーションになっています。 基本的には毎日ABC単位で1回分解くようにしています。
先日はどうしても日付が変わる前に帰れそうになかったので出先で1問だけ解きました。

環境

言語はPython3を使っています。
普段の仕事ではPHPやPython3を使っていて、慣れているのが理由です。

コードもgitで管理してGitHubで公開するようにしています。 github.com

続けてみて

成長?

まず、普段の仕事がプログラミングを扱うものなのでABC-AやABC-Bは簡単すぎて、特に躓くこともありませんでした。
ただ、ABC-Cに関しては始めた頃は全然解けず、大きな壁を感じました。
ABC-Dは言わずもがなでさっぱりです。

こういう状況でしたが、1ヶ月続けてみて、とりあえずABC-Cは多少解けるようになってきました。
これが、考察力が上がったからなのか、ABCの過去問を遡って解いているので前の方が実は平易な問題が多いからなのか、理由はよくわかっていません。
が、解けているという感覚は嬉しいものです。

少なくとも、ABC-Cからありがちな計算量はかなり意識するようになりました。
10^{5}が出てくるような問題なら二重ループにしたらダメだなとか、10^{3}が出てくるような問題なら二重ループまではいけるかなとか、この問題なら難しいことは考えずに全探索でいいかなとか、そういったことを解いている最中に考えるようになりました。

また、最低限のアルゴリズムの勉強を始めるようになりました。
そもそも、上を目指そうとかそういう高尚な考えはなく、暇つぶしにパズルを解いている感覚でやっているのですが、解けない問題が出てくると解きたくなるのが性なので、ちょっとずつ勉強しています。
累積和、DP、Union-Findあたりは、新たな知識として勉強しました。
新たな知識と言いつつ、大学時代にも勉強はしているはずなので、「大学時代もっと勉強していれば」を感じることが多いです。
もちろん、残念ながら、知識を得ることと使いこなすことは別です。

仕事への影響

今のところ、仕事に良い影響を与えているような実感はありません。
もちろん、それが目的でやっているわけではないので、全く構わないんですけど。

普段の仕事ではかなり可読性を考慮してコーディングしていて、多少の効率よりも読みやすさが重視されています。
それに対して、競技プログラミングをやっていると、多少の可読性は無視して(今の自分さえ理解できれば)、実行の効率とタイピングの効率を優先してしまいがちです。
そのため、ときどき仕事のコーディングに競技プログラミングのコーディングが混じることがあり、「やべぇやべぇ」と言って書き直すことがあり、強いて言うならという意味で、ほんの少しだけ悪い影響を与えているかもしれません。
そして全く気にしてません。

悩み

楽しくAtCoderは続けられていますが、残念なことになかなかコンテストに出られません。
休日の夜21時とかだいたい遊んでたり飲みに行ってたりするので、本気すぎない程度で取り組んでいる身としてはなかなかにコンテストに合わせるといったことはできません。
いや合わせろよって感じですが、それが今の悩みです。

あと、わからない問題があったときに、解説を読んでも全然わからないことも多いです。
読んでもわからないならわかるようになればいいのでまだいいのですが、そもそも「こちらも同じようにする」「あとはやるだけ」などと書かれているとお手上げです。
高校時代に数学の参考書を解いていて、解説を読んだら「自明」「略」と書かれていたときのことを思い出します。
全てを解説していたらいくら時間と紙面があっても足りないと思うので難しいとは思いますが、理解したいと思っている身としては歯がゆい思いがあります。

おわりに

遊び感覚で始めた競技プログラミングAtCoder)も意外と続いています。
難しい問題が解けるようになってくると嬉しいものです。
とりあえずの目標として、3ヶ月以上の継続、ABCの過去問を全て解く、コンテストに5回以上出る、水色を目指す、を掲げてみようと思います。