今回は「競技プログラミングのコンテストに参加してみたら惨敗した」という話です。競技プログラミングの概要や、初参加した感想について書いていきます。
競技プログラミングについて
競技プログラミングとは?
さて、そもそも皆さんは「競技プログラミング(通称:競プロ)」なるものをご存知でしょうか?簡単に言うと、競技プログラミングとは「プログラミングを使って早く正確に問題を解く」競技のことです。
まあ一般人はまずやらないのでマイナーなイメージがありますが、意外にも競技人口は多くて毎週のようにコンテストが開催されています。入賞すると賞金がもらえたり、就活での面接を有利に進めたりできることもあるため、特に情報系の学生に人気が高いようです。
必要とされる知識
それで競技プログラミングで必要とされる知識は、大きく分けて次の2つです。
- プログラミングの知識
- アルゴリズムの知識(数学力)
プログラミングの知識
まず、当たり前ですが「競技プログラミング」というだけあってプログラミングの知識が必須です。エラーを出さないように正確なプログラムを書くことはもちろん、文章を素早くプログラムに落とし込む能力が求められます。
アルゴリズムの知識(数学力)
それから競技プログラミングは、正直なところプログラミングの知識だけでは歯が立ちません。なぜならアルゴリズムの知識を問われる場合がほとんどだからです。
競技プログラミングでは難しい問題ほどアルゴリズムの知識や理解力を求められるので、俗に「競技プロのコンテストはプログラミングじゃなくてアルゴリズムのコンテストだ」なんて言われるくらいです。後述するように「プログラミングできるから大丈夫だろう」などと舐めてかかると返り討ちに遭うので気をつけましょう。
順位の決め方
競技プログラミングは「競技」というだけあって当然他の人と競い合います。順位はどうやって決めるのかというと、
制限時間内に正しい出力をするプログラムを書くと得点が与えられ、その得点の合計&解いた時間の早さで決まる
という風になっています。したがって、同じプログラムを書いた場合は早く解けた人のほうが順位が上になるというわけです。
問題の形式
…とまあ概要はそんなところですが、ここまで読んでもいまいちピンとこない方も多いと思います。そこで一体どのような形式の問題が出題されるのかを簡単に紹介しておきましょう。問題のイメージ(※あくまでもイメージです)は下のような感じです。
【問題】
wasa君はデータの合計を求めようとしています。整数a,b,cが入力として与えられるとき、a+b+cの計算結果を出力してください。
【制約】
1≦a,b,c≦100
【入力】
入力は以下の形式で与えられる。
a b c
【出力】
a+b+cの計算結果を出力せよ。
【入力例1】
1 2 3
【出力例1】
6
【入力例2】
4 5 6
【出力例2】
15
このように
- 問題文
- 制約条件
- 入力・出力
- 入力・出力の例(2~3個くらい)
が与えられるので、あとは与えられた入力から求められる出力をするプログラムを書いていくといった感じになります。
まあ、実際はこんな簡単な問題は出ませんが、何となく問題形式のイメージをつかんでいただけたのではないでしょうか。
競技プログラミングサイト「AtCoder」
それで競技プログラミングのコンテストを開催しているサイトはいくつかあるのですが、日本で最大手なのが「AtCoder」です。AtCoderでは毎週何かしらのコンテストが開催されており、日本のサイトではありますが全世界から数千人の参加者が参戦します。
AtCoder Beginner Contestに参加!
…さて、ずいぶん前置きが長くなりましたがここからが本題です。
今回、私は競プロ初心者向けのコンテストである「AtCoder Beginner Contest」(通称:ABC)に参加してきました。
参加の動機
まず今回競プロのコンテストに参加しようと思った動機はシンプルで、
- プログラミングの力を試したい
- プログラミング技術を向上させたい
というものです。
ただし参加前は「毎日プログラミングしてるし、なんたってビギナーコンテストっていうくらいだから楽勝でしょ」と完全に舐めてかかっていました。そう、悲惨な結果が待っていることも知らずに…。
コンテストの形式
ちなみに今回のコンテストの形式については、全6問で制限時間は100分間でした。配点は次の通りです。
問題 | 点数 |
---|---|
A | 100 |
B | 200 |
C | 300 |
D | 400 |
E | 500 |
F | 600 |
1問目と2問目は楽勝問題でしたが、3問目以降は急にレベルが上がって非常に難しかったです。
結果→惨敗
で、結果はどうだったのかという話をすると…結局3問しか解くことができず、順位は5300人中4700位台でした。ショボい!!
そして初めてついたレート(※)はなんとたったの「5」(=ゴミ)…。レート400で脱初心者レベルって言うから、初回でも100~200くらいは行くだろうと思っていたら5ですよ5!!あやうく失神しかけるところでした。
まあ、AtCoderの説明によると「コンテスト参加回数が5回未満の場合、実力よりも大幅に低いレートになる仕組みになっている」らしいのがまだ救いですけど、それにしたって酷い数値ですね。いかに自分の実力が低いかを思い知りました。
※レート:
成績に応じて変動する数値。数字が大きいほど競プロのレベルが高いと思って間違いないです。
参加した感想
最後にコンテストに参加した感想ですが…もう「舐めてかかってすみませんでした」としか言えないですね。正直普通のプログラミングと競プロは別物のように感じました。とにかく難しい!
っていうか「ビギナーコンテスト」っていうけど、どの辺がビギナーなんですかね…後半の問題とか手も足も出ないくらい難しいし、全然ビギナーじゃないと思うんですけど(名前変えたほうがいいんじゃない?)。
まあいいや…ともかく自分の実力不足を痛感するきっかけになったので参加して良かったと思いますし、このままレートが「5」しかないのも面白くないので次回も参加してみようと思います。
おわりに:競プロは難しいけど面白い
以上、競技プログラミングの概要と、実際にコンテストに参加してみた感想について書きました。
競プロはプログラムを早く正確に書けるようになりたい人にはピッタリだと思うので、興味のある方はぜひやってみてください(※過去問にチャレンジすることもできます)。そして一度絶望を味わってみるのもまた一興…諦めずに頑張りましょう。
今回は以上!