はじめに
こんにちは、新3回生のotawaです。今回は競技プログラミングで水色になりましたー的な記事となります。水色になったのは昨年の8月でそのときに記事などを書けばよかったのですが書きそびれちゃっていたので、新歓ブログのこの機会に競プロの布教(?)も兼ねて記しておきます。
競プロをはじめたきっかけ
大学に入学した直後はプログラミングは全くの未経験で競技プログラミングは存在自体知りませんでした。ランダムに入部するとプログラミング未経験者のために勉強会があるのですが、プログラミングを行ったのはこのときが初めてです。そして、勉強会の際にC言語の文法習得のための練習問題としてAtcoderの簡単な問題(A問題)が紹介されて興味を持ったことが競プロを始めたきっかけとなりました。個人的な感覚として、競プロの問題は入試数学の問題の面白いところをうまく抽出したような感じ(もちろん、問題の内容自体は異なりますが)で、高校数学はある程度好きだったので自然とハマっていきました。
レーティングの推移とか
最初の数回分はC言語の超基本的な文法しか知らず、コンテスト中に解けたものがA問題だけでした。今になって考えるとさすがにA問題だけというのは寂しいのですが、当時はコンテスト中にACできたことが嬉しくて順位などはほとんど気にしていませんでした。その後に文法を一通り習得してからは自然とC問題、D問題と解けていき、レーティングも順調に上昇していきました。この頃のD問題はアルゴリズムに関する特別な知識が無くても解けるものが偶々多かったような気がします。コンテストに出ているうちに茶色、緑色になり、「もしかして競プロって簡単?水色にもすぐになれそう」とか思っていたのですがこれが大間違いでした。グラフを見ての通り、緑になってからのレートがほとんど伸びなくなっています。要因としてはアルゴリズムの勉強をほとんどしていなかったため、知識を要する問題にまったく対応できていなかったということが挙げられます。特にグラフの問題は手も足も出ない状況でした。10月頃から少しずつアルゴリズムの勉強をやり始めましたが、学んだアルゴリズムの問題が出たとしてもコンテストですぐに結果が現れたということはあまり無く、レートが上下を繰り返していてこの時期が一番きつかったです。競プロに限らず勉強全般に言えることですが、「わかる」と「できる」との乖離をすごく感じました。できるようにするためにはたくさん精進することが不可欠ですが、当時の自分は精進量が圧倒的に足りていなかったのかなと思います。翌年の春休みくらいに苦手だったDPやグラフ問題を積極的に解いて基礎的なアルゴリズムも大体網羅しました。この頃が一番力をつけた時期だと思います。すぐに結果が出るということは無かったのですが、このときの精進のおかげで8月の夏休みにとうとう最初の目標だった水色に到達することができました。このときは本当に嬉しかったです。競プロをやってて良かったーと思った一番の瞬間でした。水色になったあとはchokudaiさんのブログの
水色 (Bランク R1200~1599 上位15%)
水色はかなり優秀です。普通に企業とかで超優秀って言ってるプログラマが居た時に、半分くらいはこのランクになると思います。数学が得意なタイプだと、この一つの上の青色に行きますが。
半数以上のIT企業において、アルゴリズム能力についてはカンストと言えるでしょう。特にアルゴリズム的な能力を必要としない会社であれば、ここから上はレートを上げても実務に役立つ部分はほとんどありません。
などを見ていてニヤニヤしていました。第三者からの評価もモチベーションの維持につながります。
そして、水色になった後のレートのグラフが途切れていますが、生活習慣がコンテストの時間と合わなかったり授業の課題が溜まっていたり、単純にサボっていたりで出場していなかったことによるものです。こんな記事を書いているのに、非常に申し訳ないです。今春からはきちんと精進してコンテストにも出場していきます。今後はまず水色中位を目指し、青パフォを出せるようにすることを目標として頑張っていこうと思います。
役に立ったこと・良かったこと
- プログラミングの授業が楽になる
学域・学類によるとは思いますがプログラミングの授業や演習では競プロを少しやっているといくらかアドバンテージを得ることができます。特に1年後期のプログラミング入門はめちゃくちゃ楽になりました。 - ゲーム制作やその他開発で役に立つ(かもしれない)
パズルゲームや敵コンピュータの思考ルーチンなどを作製する際に競プロで培ったアルゴリズムや実装力が役に立つと思います。自分はゲーム制作やその他開発の経験がまだまだ少ないので断言はできませんが、自分の経験では競プロをやっておいて良かったと感じたときは確かにありました。上達のためには毎日少しずつでもプログラミングに触れることが大切で、競プロはそのきっかけになるのではないかなと思います。 - 精進しているときは、頑張っててえらい!の気持ちになれる
一日に1ACでもしていればあとはダラダラと過ごしていても何か進捗を生んだ気分になれて、罪悪感が無くなり精神衛生上とても良いです。もちろん、ACは決して無駄になることは無く、精進を重ねれば重ねるほど確実に力になっていきます。虚無な日々を過ごしている方はぜひ競プロをやりましょう!
おそらくほかにもたくさんあります。
これまでに学んだアルゴリズムなど
- 全探索
- 二分探索
- 深さ優先探索
- 幅優先探索
- DP(ナップサック問題や桁DP、ゲームDPなど)
- 最短経路問題(ダイクストラ法、ベルマンフォード法、ワーシャルフロイド法)
- クラスカル法
- 座標圧縮
- 累積和
- いもす法
- 逆元の求め方
- Union-find
- セグメント木
たぶん書き漏れがあります。
おわりに
ランダムの過去の記事には競技プログラミングについて扱っているものが多くあるので、興味を持った方はそちらもぜひ読んでみてください。
コンテストに積極的に参加していきましょう!(ここでブーメランが刺さる)