エレコット

新卒社会人のキャリア・日常について

IT

【初心者】atcoderで競技プログラミングを始めてみた

2019/11/04

競技プログラミング(atcoder)始めてみました!

なんか中高生くらいの頃からプログラミングや「知のバトル」みたいなものには強い憧れがあったんですが、環境や機会を逃したまま23歳まで人生を送ってきてしまいました。

就職をしてからやっと時間に余裕を持てるようになり、憧れの競技プログラミングに手を出せるようになったんですね。

私のような過ちを後世に引き継がないためにも、最初から知っておきたかった躓きをまとめておきます。

・明確な目的がないなければ、登録サイトはatcoder一択
・競技プログラミングは、プログラムの実行速度を競うものではない
・使用する言語に大きな有利不利はない。好きな言語で書けばいい
・最高峰のエンジニアになってから参加するのでなく、中高生ぐらいのときにやったほうが役立ちそう
・プログラミング初心者でも始められる。環境構築もしなくてい

競プロしたいなら、とりあえずatcoderに登録

こちらのサイトです:atcoder

Twitterで楽しそうにプログラミングと付き合っている人達がよく評価の指標に出しているのが
「atcoderの色」「kaggleのランク」です。

ぼんやり眺めていただけの学生時代はあまり区別がついていなかったのですが、
atcoderで競われるのはアルゴリズム力(と数学力)
kaggleで競われるのは機械学習力
です。

「アルゴリズムとかよく知らんし、これからは機械学習の時代っしょ」
と思って、数年前に一度kaggleに登録したことがあったのですが、私は問題へのたどり着き方すら分からず挫折しました。
kaggleは海外のサイトですし、機械学習の計算に使用しているパソコンの性能が関係してくるので「リアル課金ゲー」だったで、環境構築のハードルが高そうです。

それに比べるとatcoderは、余計な部分に頭を煩わせずに、問題だけに集中できるサイトになっています。
後々kaggleのようなサイトに挑戦していきたい人も、atcoderで「そもそも競技プログラミングってどんなのか」という部分に触れられたほうがいいのかなと思いました。

atcoderとは

運営

筑駒中高→慶應SFC→atcoder社起業 といういかにも天才感あふれる「高橋直大さん @chokudai」が運営している競技プログラミングサイトです。
直大さんは、ICFPCという世界的な競技プログラミング大会(atcoderとは毛色が少し違うのですが)でも数回優勝している本物のの競技プログラマーです。

色(ランク, レーティング)

atcoderでは、後述するコンテストで出す成績によって評価ランクである色が付いていきます。
それぞれのランクはこんな感じ。説明部分は社長のブログより引用。

世界大会とかに招待されたりする
あたまおかしい。
化け物。競プロの問題を解く機械
一部上場のIT企業でも、一人もいないことが結構あるレベル
基礎的なアルゴリズム処理能力については疑いのないレベル
大抵の企業でアルゴリズム力は十分。
AtCoder的には上位ではないが、他社評価サイトなら上位1%の最高評価がつく
学生なら優秀。エンジニアとしてはちょっと物足りない
コンテスト参加者はここからスタート

Twitterでは水色以上あたりから一定の評価を受けているイメージがあります。
ただ、私が実際にやってみた感じ緑でも優秀な部類になると思いますね。

私が勤めている会社も一部上場企業ですが、水色~青がいるかちょっと怪しいレベルです。
初心者は緑を当面の目標に頑張っていく形になると思います。

コンテスト

レートを決めるコンテストは、毎週末に開催されている定期開催のものと、企業などが随時主催するものがあります。

Atcoderトップページのサイドバーから、開催予定のコンテストが見られるので、ここから事前に参加表明をしておく必要があります。
表明といってもボタンを押すだけで、バックれてもレートにペナルティなどはないです。

atcoderのサイドバー

定期開催のものにも、
・初心者~上級者向けのAtCoder Beginner Contest (ABC)
・上級者向けのAtCoder Grand Contest (AGC)
の二種類があるのですが、ABCのほうが頻度高く(ほぼ毎週)開催されていますね。

コンテスト内では問題が6問出題され、簡単な順にそれぞれA~Eの難易度順にランクがついています。
難しいものほど、配点は高く設定されています。

atcoderの問題文

参加者の中で早く解いたほうがレートは上がりやすいのですが、間違った回答を提出すると5分遅れたとみなされるペナルティがあります。

そのほかいろいろ

AtCoder Beginners Selection(過去問精選 10 問)

atcoderに登録した直後は、トップの「常設中のコンテスト」にある過去問精選10問というのをやろう!
みたいに案内されます。

こちらは、アルゴリズム力を自分の頭で考えるというよりは、競技プログラミング特有の入力や出力の癖になれる意味合いが大きい気がしますね。

「2つの変数に空白区切りで同時に値を代入」
「n個の変数にn行入力される値を代入」
なんていう、普通のプログラミングをしてたらあまり使う機会の無い実装にここで慣れます。

私はここの意味合いがよく分からずに、自分の頭をひねって「競技プログラミングって思ったより難しいなー」なんて捉えてしまっていたので、3週間程atcoderから遠ざかってしまいました。

言語はC++じゃなくていいの?

競技プログラミングを始める前に、
「競技プログラミングは速度制限があるから実行の速いC++でやらないとダメ」
みたいな話を聞いていたので、比較的遅いといわれるPythonのようなスクリプト言語しか書けない私には取っ掛かりのハードルが高かったです。

C++を学ぼうとして断念する期間で4ヶ月くらいロスしました。

しかし、いざPythonで始めてみると全然戦えないということはなかったです。
「Pythonでは通らないけどC++では通る」というような問題は少なく、もっと抜本的にアルゴリズムから改善しないとC++でも通らないよう調整されている問題が多いです。
(Nの二乗回の計算量をどうN回に減らすか、など)

プログラミング練習してからじゃなくてもできるの?

コンテスト内のA問題はプログラミング初心者が解くような例題レベルになっています。

また、AtCoder Programming Guide for beginnersというプログラミング初心者向けのメニューが用意されており、未経験の方でもC++をatcoderで学んでいけます。

淡々とした参考書を進めるより、むしろ問題を解きながら実践的に進められるのでモチベーションも保ちやすいかなと思います。

コンテストの問題を解いている最中もGoogle検索可能ですし、過去の自作プログラムの流用、ライブラリの利用などもOKになってるので、非本質的な部分ができるだけ排除されています。

競技プログラミングができて何の役に立つの?

atcoderのレートを青以上くらいまで上げていくと、年収1,000万超のヘッドハンティング等もあるようです。
atcoder jobsという、上位ランカー向けの転職サービスも用意されています。

私も若干これを期待して競技プログラミングを始めてみた節はありますが、狙ってそこまでいくのは正直難しいですね。
初めてすぐに、緑ランク目標くらいが妥当かなと思いました。

上位の方も、好待遇とか高収入を狙って上位レートを取っているというよりも、「趣味として楽しく問題を解いていたら、気づけばその境地にいた」みたいな感じなのかなと思います。

競技プログラミングで出される問題は、ソフトウェア開発で使えるようなエンジニアリングというよりは、大学受験数学のようなパズルゲーに近いです。
コンテスト後に解答のpdfが配られたり、解説動画がライブ中継されたりと、無料で若きあの頃の追体験ができるのが個人的にハマっています。

どちらかというと、社会人のおじさん達よりも、中高生ぐらいの若い方が競技プログラミングやったほうが将来に活きてきそうだなと思います。
グラフや微分積分はあまり出てこないですが、数列や整数の処理には強くなるし、プログラムによるシミュレーションが早めにできるようになっておくだけでもその後の伸び率がグンと変わると思います。

おわり

-IT
-