初めに
初めまして、塚っちゃん(Hiro_Gt)と申します。
この度、AtCoderに取り組み始めて9ヶ月で水色を達成しました。私は非情報系院生ですが、復習に特化して競プロの勉強を進めていた為、比較的早い期間で水色を達成できたと考えています。
そこで本色変記事では、具体的にどう復習したかに重点を置いて水色到達までを振り返ろうと思います。
この記事がどなたかの参考になれば幸いです。
自己紹介
- 非情報系大学院
- 具体的には物理学を専攻していました
- AtCoder開始時のプログラミング経験:半年
- 卒業研究で物理実験のデータを解析する際にpythonを使用していた程度です。具体的にはfor, if文は分かっていて、ネットの記事を参照しながらmatplotlibで図を出力していた程度。
- ネットで調べながらコーディングは出来るけど、何も見ずにコーディングは出来ないレベル
勉強方法
冒頭にも軽く触れた通り、私は復習特化で水色に到達したと考えています。実際私が調べた限りでは、水色到達時の自分の過去問演習量は恐らく少ない方で、過去問を通した演習量には力を入れていないことが見てとれるかと思います。
ならどのような復習方法をとったのか。私は自力ACした問題もAC出来なかった問題も共に復習を行なっていました。具体的には以下の通りです。
AC出来なかった問題の復習プロセス
- 解説を読んだ上でACコードを実装する(解説AC)
- 知らないアルゴリズム・データ構造が解説文中に登場したら、自分で勉強した後に自分でノートにまとめる
- あくまでも文章だけ読んで解説ACする(他人のACコードは読まない)
- 解法プロセスをプログラミングできちんと表現する力を養うためにこのような手法をとっています
- 他人のACコードを読んで理解
- 提出順が早い人のACコードを読む
- 早くAC出来る人は、思考プロセス・コーディング記述共にシンプルなことが多いと感じています。そのため、実装方法に関して参考になることが多いです
- コードリーディング中に知らない関数・ライブラリなどと出会ったら、勉強してノートにまとめる
- 自分のACコードより簡潔なコーディング記述があったら、アイディアとしてノートにまとめて、その記述方法で改めてACしてみる
- 面倒臭いですが、より簡潔な記述でACする練習をすることで、コンテスト本番中も回りくどくない単純なコーディングを行うことが出来ます
- 提出順が早い人のACコードを読む
- 自分で問題の解説をノートにまとめる
- 特になぜAC出来なかったのか、どんな知識・発想が必要かを考えて、解答に至る思考プロセスをまとめる
- 例えば、動的計画法の問題でなぜDPの定義を解説の通りにするのか考えてみます
- 特になぜAC出来なかったのか、どんな知識・発想が必要かを考えて、解答に至る思考プロセスをまとめる
自力AC出来た問題の復習プロセス
- 解説を読んで、想定解法と同じやり方かチェック
- 違っている場合、『AC出来なかった問題』として復習する
- AtCoderの問題を通して学んで欲しいこと、が(確か)定まっているはずです。その為、出題意図と同じ解法でAC出来るようにしました
- 違っている場合、『AC出来なかった問題』として復習する
- 他人のACコードを読んで理解(以下、AC出来なかった問題の復習と同じ)
- 提出順が早い人のACコードを読む
- コードリーディング中に知らない関数・ライブラリなどと出会ったら、勉強してノートにまとめる
- 自分のACコードより簡潔なコーディング記述があったら、アイディアとしてノートにまとめて、その記述方法で改めてACしてみる
ノートのまとめ方
上記の復習プロセスで度々『ノートにまとめる』と説明しましたが、ノートのまとめ方も自分なりに拘っていました。具体的には以下の通りです。
- 参考にした記事等を一切見ずに、自分の言葉で解説を書く
- 何も見ずに自分の言葉で解説を書けるということは、きちんと自分が理解できている証拠になるからです
- 公式解説として書く気分で、他人に説明するように解説を書く
- 他人に理解できる解説文ということは、曖昧ではなくきちんと筋道立てて解説できる位理解する必要があるからです
水色到達までに学習した主なアルゴリズム・データ構造
他にも学習したアルゴリズム・データ構造は存在しますが、複数回使用したことのある事項を以下に載せています。
- DP
- 期待値DP
- 累積和
- 確率mod
- 二分探索
- 尺取り法
- DFS・BFS
- 二部グラフ
- ダイクストラ法
- トポロジカルソート
- UnionFind
今後の抱負
- 1ヶ月間ABC-unrated参加して、水〜青色の過去問演習をする
- 水色達成したものの、まだ水色diffを安定してAC出来ない・青色diffが解けないことから、恐らく今の実力じゃ水色で停滞するかな…と感じています。その為1月の間はunrated参加して、水〜青色精進をし続けようと考えています。
今後もしかしたら、過去問の青色diff問題の解説記事を上げる…かもしれないです。
- 水色達成したものの、まだ水色diffを安定してAC出来ない・青色diffが解けないことから、恐らく今の実力じゃ水色で停滞するかな…と感じています。その為1月の間はunrated参加して、水〜青色精進をし続けようと考えています。
- C++で灰色diffの過去問演習
- 大学院の研究でC++を使用する機会が増えました。その為AtCoderを通してC++の勉強をしようかな…と考えています。
AtCoderの問題を解くことを通して、プログラム言語そのものの勉強も出来ることは競プロの大きなメリットだと思っています。
- 大学院の研究でC++を使用する機会が増えました。その為AtCoderを通してC++の勉強をしようかな…と考えています。
- SIGNATE(データ分析・機械学習コンペ)に参加
- 実は今データサイエンス領域に興味があるため、Kaggleのようなデータ分析コンペに挑戦しようと考えています。その為まずは日本のコンペサイトから手をつけてみようと思っています。
最後に
大学院での研究&就職活動を両方しながら趣味で競プロに割ける時間は正直少なかったです。ですが時間が少ないからこそ、問題に対する演習は丁寧に行った結果、9ヶ月で水色を達成できたと思います。
ここまでお読み頂きありがとうございました。今後も競プロに励むように頑張ります!!