自己紹介
はじめまして、yamamotoyukiと申します。
東大エンジニアリング研究会というサークルで、競プロの勉強会を行っており、私が水色になるまでに学習したことをまとめることにしました。同様の記事はたくさんあるので、AtCoderを行う方は一つの意見として参考にしていただければと思います。
始めた時期
私はプログラミングの学習を本格的に始めたのが2022年の3月からなので、はじめは基礎文法を学んでいました。
6月に入り、ある程度は基礎文法を理解したので、AtCoderのコンテストに参加してみたところ、基礎文法とある程度の数学的考察でABCはC問題くらいまで解けるようになっていました。
コンテストに参加するときに理解していたことは下記の2つぐらいだったと思います。
1.pythonの基礎文法
2.実行時間に間に合うためのループ回数の上限
基礎文法はAtCoderで始めるPython入門 のサイトに載っている内容がなんとなく分かる程度です。
ちなみに私は頻繁に使わないものの書き方を覚えてはないです。
基礎文法は最初に学ぶのではなく問題を解きながら学んでいくのもありな気がします。
ただし、ループ回数の上限は108程度であるということは最初に知っておくべきだと思います!
灰色から茶色のとき
私は最初にコンテストに参加したときからある程度解けるようになっていたので、このときはABCのC問題までを30分で解くのが目標でした。(あわよくばD問題も解きたいとは思っていましたが)
この段階で最初に学んだのは二分探索とソートアルゴリズムです。
これらのアルゴリズムの学習と同時にデータ構造についても簡単に学習しました。
時期で言うと6月から7月頃です。
データ構造は最初の方に学んでおくと、アルゴリズムを勉強したときに実装のイメージが付きやすいと思います。
緑色のとき
水色になるためにはD問題を解くことは必須であるので、まずD問題頻出の動的計画法について学びました。
また、動的計画法と同じくらいの時期に、幅優先探索と深さ優先探索を学びました。
これは8月から9月頃です。
動的計画法の問題をある程度解けるようになったら、グラフアルゴリズムを学び始めました。
このときにUnionFind木について知りましたが、もっと早く知っていればよかったと思います。
グラフアルゴリズムではダイクストラ法やワーシャルフロイド法といった最短経路をもとめるアルゴリズムと最小全域木を求めるクラスカル法などを学びました。
グラフアルゴリズムは10月に学びましたが、概念を理解しただけで今でも実際に使えるレベルではない気がします。(ちなみに10月は毎日競プロの勉強をしていました。)
11月12月はあまり勉強する時間がなく、コンテストにも参加できないことがありましたが、12月中旬からは再びコンテストに参加し、時々練習として問題を解くようにしています。
まとめ
競プロの勉強は自分のペースで少しずつ新しいアルゴリズムを学んでいけばいいと思います。
ただ、概念だけ分かっていても実際に問題を解けるわけではないので、アルゴリズムを学んだら問題で使えるように練習するといいと思います。(私も今まで学んだアルゴリズムの問題を練習しなければと思っています)
私自身は青色を目指して精進していきたいと思います。
拙い文章ですが、読んでいただきありがとうございます。