🟤

無職が茶色になりました(AtCoder の始め方、取り組み方、得られたこと)

2025/01/12に公開

こんにちは無職です。

データ構造とアルゴリズムを学ぶべく AtCoder に取り組んでいるのですが、先日 AtCoder Beginer Contest への 10 回目の参加で入茶(レート 400 に到達)できたので、記念に AtCoder の始め方、取り組み方、得られたことをまとめていきます。

image
入緑するまでは恥ずかしいので id は公開しません。

私のプロフィール
  • web エンジニア歴 4 年~
  • 文系学部出身(中学数学で止まっている)

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 社の方々や、この記事で勝手ながら名前を出させていただいた方々に感謝申し上げます。ありがとうございます、お世話になっております!

脚注
  1. AtCoder には、ABC 以外にも様々なコンテストがあります。データ構造とアルゴリズムを学びたい初心者は ABC 一択です。間違って上級者向けの ARC などに出てしまうと心が折られます。 ↩︎

  2. 他にも様々な機能がありますが、自分は table ページ以外はあまり使っていません。 ↩︎

  3. AtCoder ではコードを1ファイルにまとめて提出する必要があるため、モジュールやパッケージとして別ファイルに実装してインポートすることはできません。 ↩︎

GitHubで編集を提案

Discussion