はじめに
今回の記事はABC384で緑色に到達したので、これまで行った学習方法を紹介したいと思います。
本記事の対象は緑色に達していない方や効率の良い学習方法を知りたい方を対象として作成しています。
レート推移
前回の記事
入茶したときの記事も執筆しているので興味がある方は是非見てみてください ^_^
目次
1. 筆者のスペック&入茶時の実力
- 大学が物理系のため数学は比較的得意
- Pythonを2~3年触っているため、for文やwhile文, if文等の演算についてはノータイムで実装可能
- 基本的な配列の操作の計算量は学習済み
- アルゴリズムの知識(実装は出来ないが解説を読んだら雰囲気だけわかる)
- 2分探索
- 全探索
2. 入緑時の実力
- 頻出するメソッドやライブラリをノータイムで使用可能
sort
set
collections
itertools
- TLEを基本的にせず、計算量を見積もることが出来る
アルゴリズムの理解度
-
dp(動的計画法)
- 理解度15%
- 解説を見ても中々実装出来ない
- 調べると色々なdpがあり、よく分からない
-
しゃくとり法
- 理解度40%
- インデックスがズレたりしてしまう
-
bfs(幅優先探索)
- 理解度60%
- dequeを用いて探索を行うことが出来る
- 計算量の概算がしづらい
-
累積和
- 理解度90%
- デバッグしないと正しく実装出来ているか分からない
-
二分探索
- 理解度95%
- bisect_left, bisect_rightの使用はスムーズに実装可能
- 仕組みも分かるが、自分で実装するのには時間がかかる
3. 学習方法
時系列順に学習した内容を振り返りたいと思います。
2024/07/27~2024/09/14
やったこと: コンテスト参加
レート推移: 434→ 511 (平均+15.4)
コンテスト終了後に毎回解けなかった問題の復習に時間をかけて行っていました。
しかし、新しいアルゴリズムを知識としてインプットしただけだっため、同様の問題が出てきても時間内に解くことは出来ませんでした。
ここまででレートは511になり、スムーズに上がっていきましたが、A問題とB問題の早解きでなんとかなっている回が多かったです。
振り返り
コンテストに参加出来ない回も多かった中、案外レート上がったなと思いました。
一方、このままだと緑色にはなれないなーという漠然とした課題を感じていました。
2024/09/14~2024/10/30
やったこと: 過去問への着手(A,B問題埋め)&コンテスト参加
レート推移: 511→681 (平均+21.25)
年内に緑色になりたいという目標があったので、本格的にAtCoderのための学習を始めることを決意しました。
そこで効率的な学習方法を探していたときにYoutubeで10ヶ月で水色になった方法を紹介している動画を見つけました。
こちらの動画内では、とにかく過去問を解きまくることを推奨されていました。
ABC212以降の問題から解くことを推奨していたため、私もABC212以降から埋めることにしました
参考動画
A埋め
A問題を解くか悩みましたが、AtCoder Problemsの空白が埋まっていくのが気持ちよかったので、全て解きました。ただ、A問題を200問近くひたすら解くのは退屈だったので、新しく学び始めたGo言語で解きました。
言語の習得をしながら楽しく埋められたと思います。
体感2~3分で各問解いてた気がします。
B埋め
B問題はdifficultyが小さい順に解きました。
途中でやめてしまうことを何よりも恐れていたので、とにかく埋めることを目的として学習をしました。
序盤の問題は引き続きGo言語で解いて行きましたが、複雑なデータ構造を要求する問題や、便利なライブラリを使用したいときはPythonで妥協して解きました。
10月の下旬の方は実装が重い問題だったので殆どPythonで解いていたと思います。
振り返り
レートが上がったのにも関わらず、上昇幅も上がっており学習が結果にしっかりと反映されていました。
もともと早解きは得意な方だったと思いますが、演習量を増やしたことでより早く解けるようになったと感じます。
また、これまで知らなかったライブラリやメソッド(collections.defaultdict
, set
)なども積極的に使っていったことでコンテスト中もスムーズに解けた気がします。
早解き力と基礎力が向上し、レートが目に見えて上がりモチベーションを保つことが出来ました。
特に競技プログラミングの典型であるグリッドやグラフ、浮動小数点の誤差等の演習に触れられたのは非常に良かったと思います。
C問題以降でも同様の問題が登場するので、これは効果的だったと思います。
2024/10/30~2024/12/07
やったこと: 過去問への着手(C問題埋め)&コンテスト参加
レート推移: 681→823 (平均+17.75)
B問題を完了したので、C埋めを始めました。
B問題と同様にdifficultyが低い順に解きました。
2024/12/07までに、143/173解きました。
緑diffやグラフ、dp、実装が重い問題等は解けませんでした。
振り返り
思ったよりもスムーズに入緑することが出来てびっくりしています。直近は緑パフォーマンスを連発していていました。要因は、やはり地に足をつけて、簡単な問題から潰していくことが大事だったと思います。
これまでに解いた演習量
解いた問題数
演習量の推移
AC数
4. 入緑までに特に効果的だった学習法
序盤は解けなかったC問題やD問題の復習をしていましたが、中々結果に結びつきませんでした。
そこで、焦ってC,D問題を解こうとするのではなく、A,B問題を埋めることを徹底しました。
B問題も一部実装が重く簡単に解けない問題があったので、糧になってると思います。グリッドやグラフの問題が特に苦手だったので、B問題を使って慣れていくことができました。ただ、簡単すぎる問題は退屈だったので新しいプログラミング言語の勉強も兼ねて緩くやれました。
A,B問題が解き終わった後に、C問題を解きました。atcoder problemsのdiffが低い順に解いていきました。灰色diff+茶色下位diffを解いたタイミングで今回入緑しました。過去問をひたすら解くだけでスムーズにレートが向上することを身を以て体験しました。
また、githubを用いて、復習とコンテスト中のカンニングペーパーを作成しています。こちらはまた別の記事で共有したいと思います。(しばしお待ち下さい)
5. 現状の課題と今後の抱負
課題
緑色になったとはいえ、実装力が向上は正直まだ実感していないです。
複雑なデータ構造になった時は頭がこんがらがり、実装に非常に時間がかかってしまいます。
使用出来るアルゴリズムが少なく、無理やり解いている感じが否めないです。
抱負
- 実装力を上げる
- 新しいアルゴリズムの習得
- CLIツールの導入
まだ水色パフォーマンスを取ったことが無いので分からないですが、これらを完璧にすれば、入水することが出来るんじゃないかと思っています。(色々手を出すと大抵上手くいかないので地に足をつけて進んでいきたいと思います)
また、テストケースが通ってるかを確認するツールがあるらしいので、レートを少しでも上げられるような工夫をしてみたいと思います(ちゃんと見ないでWAになりがちなので💦)
6. さいごに
始めた最初は、緑色はおろか茶色にもなることが出来るか分からないレベルでした。
ただ、継続的に過去問を解いたことでスムーズにレートを伸ばし、緑色に到達することが出来ました。まだ緑色になっていない方も私が実践した方法を参考にしてみてください!
2026年の3月まで(学生の間)に自分も水色に到達出来るように引き続き精進したいと思います!
水色になった際にもまた記事を執筆したいと思うので、それまでお待ちください^_^