競技プログラミングってなあに?
近頃、「そもそも競技プログラミングって何?」と聞かれることが多かったので、説明用の記事を書いておこうかなと思います。
よくある質問的なものも少しだけ。
(間違えて記事消しちゃったので復旧しました)
そもそもプログラミングってなに?
プログラミングというのは、コンピュータが理解することが出来る言語を書くことにより、プログラムを作ることを言います。パソコンの中で動くものを作ることだと思って貰えば大体間違ってないです。
競技プログラミングとは?
競技プログラミングとは、プログラミングの技術を競い合うコンテストの総称です。
色々なジャンルがありますが、今回は、出来るだけ狭義の競技プログラミング(AtCoderやTopCoderなど)について説明します。
プログラミングの難しさは、組みたいプログラムによって違います。単純な計算を行うだけのプログラムは簡単に組めますが、難しい計算などを行うプログラムは、コードが複雑になったり、数学的な工夫をしないと、実行時間が長すぎて終わらなかったりします。
競技プログラミングでは、どんなプログラムを作るべきかが与えられる(以下、問題と呼ぶ)ので、要求通りのプログラムを作ることが目標です。問題が複数与えられるので、たくさん解けた人が勝ちで、正解数が同じ場合は早く解けた人の勝ちです。
具体的にはどんな問題なの?
競技プログラミングで出てくる問題は、以下の4要素で大体出来てます。
- 問題文
- 入力形式
- 出力形式
- 入出力例
具体例を出すと、こんな感じです。
問題文
A,Bの2つの整数が与えられる。A+Bの値を出力しなさい。
入力形式
2つの整数A,Bが、スペース区切りで与えられる。
出力形式
求めるべき答えを1行で出力しなさい。
入出力例
6 3 → 9
123 555 → 678
これでは簡単すぎて問題になりませんが、形式としてはおおよそこんな感じになります。今回は整数が入力として与えられましたが、文字列(abcde、など)が与えられたりします。
難しい問題って、例えばどういうの?
イメージしやすいものだと、川渡り問題とかでしょうか?
オオカミとヤギを連れキャベツを持った農夫が川岸にいる。川にはボートがあるが農夫の他には動物一頭かキャベツ一個しか乗せられない。農夫がいなければオオカミはヤギを襲うし、ヤギはキャベツを食べてしまう。すべてを無事に対岸に渡すにはどうしたらよいか?
こういう問題、どうやって解けばいいか難しいので、うーんうーん、ってなると思います。大体、人間が「うーんうーん」ってなる問題は、コンピュータにも難しいです。
こういう問題で、人数や登場人物、関係性が変わっても解けるようなプログラムを書くのは、やっぱり難しいですし、書ける人はすごい!ってなるわけです。
結局どういう能力を競うことになるの?
これは多少主観が入りますが、
- 書きたいプログラムを早く正確に書ける能力(実装力)
- 普通に計算出来ないようなことも、数学的工夫により上手く計算出来るようにする能力(アルゴリズムを考える能力)
あたりは間違いないんじゃないのかな、と思います。
競技人口は?
日本人の競技人口ですが、AtCoderにコードを提出したことがある人、という基準でカウントすると、一応5桁に乗るくらいです。
そんなに多くないけれども、プログラムを書ける人口を考えると少なくもない、って感じでしょうか?
ほぼ毎週行われているAtCoderのプログラミングコンテストでは、毎週300~600人程度がリアルタイムで参加しています。
就職に有利なの?
立場上、NDA的に話せないことが多いのですが、dwangoさんが記事を出してくれました。
昨年実施した第1回dwangoプログラミングコンテスト「ドワンゴからの挑戦状」では、社会人含めてコンテストへの参加者は590人となり、そのうち12名が2016年度ドワンゴ新卒採用にて内定するという結果となりました。
競技プログラミングをすることで内定が得やすくなる、という証明にはなりませんが、競技プログラミングをしている人は内定が出やすい、程度の証明にはなっているかと思います。
他にAtCoderでコンテストを開いている、リクルートホールディングス(indeed)、KLab、Donutsなどは、似たような傾向があるのではないかと思います。
この記事は出来るだけ主観が入らないように書いているので、「仕事でどう役立つ」「どうやったら強くなる」「何が楽しい」「実際内定が出やすくなるか」などは(需要がありそうなら)また別の記事で!