競技プログラミング(AtCoder)始めてみた-競プロとは、AtCoderとは、始め方-

競技プログラミング(AtCoder)始めてみた-競プロとは、AtCoderとは、始め方-

最近技術系のネタがなく、技術記事を書けていなかったので競技プログラミング(以下競プロ)を始めてみた、
毎週末の土日祝日に開催されるので、毎週1~2記事のネタが出来る!
というわけで、早速競プロとは何か、どんな風に始めればいいか、そして初めてコンテストに参加して分かったことを書いていく。

競技プログラミングって何?

まずそもそも、競技プログラミングとは何だろうか?
名前の通り、プログラミングで競い合うことを指すのだが、Wikipdiaではより詳細な説明がされている。

参加者全員に同一の課題が出題され、より早く与えられた要求を満足するプログラムを正確に記述することを競う。

ということで、実際コンテストもそのような感じであった。

また、Wikiにも書かれているが、ある程度上に行くためには数学の知識はほぼ必須だと思っていい。
ABC(D)の3~4問形式で大抵出題されるのだが、ABまでは数学の知識は無くても行けるのだが、
それ以降はおそらく知識がないと問題文を読むのも大変だと感じるのではないだろうか。
(もちろん数学の知識が無くても思考力・発想力などあればいけるは行けると思うが、中々その領域に達するのは厳しいだろう)

はじめ方

では実際参加する場合どうすればいいのか。
全てネット上で可能なので、コミュ障でも安心仕様になっている。
コンテストを開催しているところはいくつかあるのだが、今回は自分が参加したAtCoderという場所を紹介する。

AtCoderの公式ページ
https://beta.atcoder.jp/

はじめ方は至って単純で、
サイトの右上から新規登録をして、毎週末送られてくるコンテスト案内のメールのURLにアクセスし、参加登録するだけである。

atcoderattend
ぽちっと押したらコンテストの時間に間に合うようにこのページにアクセスすればOK!

まずはbeginner contestに参加するのが良いだろう。(それでも結構な難易度である)

コンテスト前に

コンテストでは結果次第でrateというのが付き、それ次第で自分のランクが上下していく。
最初は気にせず参加して雰囲気をつかむのが良いと思うが、
慣れてきたらただコンテストに参加するだけでなく、いろいろ準備する必要がありそうだ。
早速コンテストに参加して感じた事前準備について以下のものを順番に解説していく。

  • 過去問を解いて問題の出題傾向に慣れる。
  • アルゴリズムの知識の習得(蟻本など)
  • 専用のコーディング環境を作る

過去問を解いて問題の出題傾向に慣れる。

まずは出題傾向に慣れていく必要がありそうだった。
特徴的だと思ったのは、「ある処理をした結果を出力」問題と「ある処理を施すためには最小(最大)何か所変更するか出力」問題があるという点だ。
ある処理をした出力結果を出す」のは普段の業務でよくやるのだが、
ある処理を施すためには最小何か所変更するか出力」というのはやったことがなかったため、難しくて時間オーバーしてしまった。
以下のアーカイブから過去問にチャレンジできるので、何個かトライして出題傾向に慣れつつ思考力を高める必要がありそうだ。
https://beta.atcoder.jp/contests/archive

アルゴリズムの知識の習得

上にも書いたが、ABは比較的数学の知識がなくても解ける問題なのだが、
それ以降は数学知識の有無で難易度が大きく変わってくる
蟻本など、競技プログラミング用に最適化された学習本を使って最低限のアルゴリズム知識を入れておいた方が良いだろう。

専用のコーディング環境を作る

実際にコンテストに参加して一番これを感じた。
問題文を見てCtrl+TabでEclipseに移動して・・・ということを繰り返してやってみたのだが、
Eclipseは決して軽量な実行環境ではないので、中々処理のテストを走らせるのにも時間がかかってしまっていた。
もっとlinuxのterminal上でコマンドを打ち込むような手軽さが必要だと感じた。

早速参加してみた

長々と書いてきたが、筆者も早速以下のコンテストに参加してみた。
https://beta.atcoder.jp/contests/abc111

atcoderabc111
B問では1byteほどコードが足りずにこけている痛恨のミス

結果はABのみAC(正解)・・・。
残念ながらCは時間内に解くことは適わなかったが、いい経験になったと思う。
当面はC問題をコンスタントに解けるように頑張りつつ、
毎週解けた問題のコードを晒しながら解説のようなものをしていきたい。