無職が茶色になりました(AtCoder の始め方、取り組み方、得られたこと)
こんにちは無職です。
データ構造とアルゴリズムを学ぶべく AtCoder に取り組んでいるのですが、先日 AtCoder Beginer Contest への 10 回目の参加で入茶(レート 400 に到達)できたので、記念に AtCoder の始め方、取り組み方、得られたことをまとめていきます。
入緑するまでは恥ずかしいので id は公開しません。
私のプロフィール
- web エンジニア歴 4 年~
- 文系学部出身(中学数学で止まっている)
AtCoder の始め方、取り組み方
時系列順にまとめます。
- 使う言語を決める。
- AtCoder に登録し、AtCoder Beginer Contest(通称 ABC)[1]に参加する。
-
AtCoder Problemsで ABC の過去問を解き、記事にまとめる。
- 最初は A~C 問題までで、慣れてからは A~D 問題まで。
- 標準入出力のヘルパー関数を用意する。
- 公式の解説放送を見始める。(例)
- データ構造、アルゴリズムのコードスニペットを用意し始める。
- atcoder-cli, online-judge-tools を導入する。
- ローカルの言語のバージョンをAtCoder のジャッジサーバーのものと合わせる。
- 許可された外部ライブラリをインストールしておく。
- 番外編:こちらの動画「AtCoder で水色になりました!ここまでの戦略・練習量・知識を紹介」から取り組み方や心構えについて参考にする。
以下補足です。
使う言語を決める
個人的に好きな Go 言語にしました。C++の文法の勉強に時間を割きたくなかったためです。
- 公式の解説は C++または Python で書かれている。
- C++ではデータ構造とアルゴリズムに関して、ACLという便利なライブラリが使えたり、そもそも標準パッケージが充実している。
というデメリットがありますが、入茶するまでに特に致命的だと思ったことはないです。
(おそらく入緑するまでも。)
AtCoder に登録し、ABC に参加する
勉強やコードスニペットの用意より先に、コンテストに参加してしまうことをお勧めします。全然問題が解けなくてもレートが減らないので、デメリットがないです。(最初は皆 レート 0 なので。)
AtCoder Problems で過去問を解き、記事にまとめる
AtCoder Problems とは、kenkoooo さんという個人が作っている、コンテストへの取り組みの進捗を可視化できるツールです。過去問を解くことでも反映されます。
table ページからコンテストの過去問を、難易度を示す色やレート目安と共に一覧表示できます。自身の AtCoder ID を入力すれば AC(Accepted) 済みの問題もハイライトされます。[2]
学んだデータ構造やアルゴリズム、考え方を定着させるために、記事にそれらをまとめています。(分量が多くなってきたので、現在は notion DB 等への移行も検討しています。)
標準入出力のヘルパー関数を用意する
入出力が数十万行に渡るような問題も存在するので、標準入出力の効率化はいずれ必須になります。(問題の解法があっていても TLE(Time Limit Exceeded) になってしまう。)
バッファを活用した高速な入出力のヘルパー関数を用意しています。(コード)
公式の解説放送を見始める
解説記事(例)は簡潔に書かれており、私では内容を理解できないことも多かったです。
しかし解説放送(解説タブの上部にリンクがあります)は、驚くほど分かり易いです。 基本的なアルゴリズムや数学の用語も解説してくれています。
データ構造、アルゴリズムのコードスニペットを用意
解法に必要なデータ構造、アルゴリズムを知っていても、毎回ゼロから実装していては時間が足りません。コピペできるように[3]予め用意する必要があります。
AtCoder では言語ごとに指定された一部の外部ライブラリしか使用できないため、自前の実装も必要になります。
中身を理解しないと使いこなせないため、他人のコードスニペットをコピーして用意するなどはしていません。
atcoder-cli, online-judge-tools を導入
atcoder-cliは、Tatamo さんという個人が作成しているツールで、online-judge-toolsはその依存ツールです。
両方をインストールすると、cli でのサンプルテストケースの実行、 コード提出などができるようになります。時短になります。
インストール方法は開発者様の記事をご覧ください。
ローカルの言語のバージョンを合わせる
本番で提出したプログラムがバージョン起因の CE(Compilation Error)になり焦ったことがあるので、goenv を使って合わせました。一応やっておくことをお勧めします。
許可された外部ライブラリのインストール
go では C++のstd::set(頻出データ構造)が標準では存在せず、自前での実装も厳しかったため、set で解く問題にあたって以来外部ライブラリも利用するようになりました。
番外編
AtCoder を始めるにあたって、本堂俊輔 さんという方のこちらの動画「AtCoder で水色になりました!ここまでの戦略・練習量・知識を紹介」が大変参考になりました。
特に、以下のようなメンタル面の部分が参考になりました。世の中、自分より若くてレートが遥かに高いような人がたくさんいます。他人の成長速度やコンテストでの敗北に揺さぶられないメンタルは、多くの人にとって重要だと思います。
- 1 回のコンテストでのレートの上下や、他人の成長速度を気にするのは無意味。
- 練習で解いたことのない難易度、データ構造・アルゴリズムの問題は、本番で解けるわけがない。
得られたこと
AtCoder に参加することで、以下のようなものが得られました。
- 基本的なデータ構造やアルゴリズムについての知識。
- 問題を言い換えたり、管理すべき状態を限定したりして、問題を単純化するテクニック。
- 勉強の楽しさに気づいた。
- コンテスト本番のひりつき、興奮。
何より楽しいですし、きっと業務でも役立つはずです。(今は諸事情により無職ですが。)入緑目指して引き続き頑張ります!
最後に
AtCoder 社の方々や、この記事で勝手ながら名前を出させていただいた方々に感謝申し上げます。ありがとうございます、お世話になっております!
Discussion