競技プログラミングを始める方へ

Last-modified: 2013-09-02 (月) 22:55:34

競技プログラミングとは

競技プログラミングでは、一般的なプログラミングとは求められるものが違います。
競技プログラミングで求められるのは、いかに早く正しいプログラムが作れるのかということです。
保守セキュリティ再利用などは考える必要はありません。

そのため、危険な関数 (例 scanf) を使うのに躊躇する必要はありませんし、汎用性を考える必要性もありません。ただし、普通のプログラミングでそれを行なってしまうと問題なので、しっかりと区別して書けなくてはいけません。

競技プログラミングに適した言語

結論を言うと、C++ もしくは Java です。
C言語が含まれていませんが、これには理由があります。

まず、C言語の機能は C++ に含まれているので、機能面でC言語を選択するメリットはありません。*1
さらに、C言語の標準ライブラリは、プロコンで戦うにはあまりにも貧弱です *2

そのため、本格的に競技プログラミングを始めようというならば、C言語でプロコンに出場しようとは考えないでください

ではなぜ、C++, Java であるかというと、理由は簡単で、プロコンでそう指定されているためです。

多くのプログラミングコンテストでは、C/C++/Java が利用できるようになってます。*3
その他の言語が利用できる場合もありますが、覚えたとしても大会によっては利用できない可能性があります。
そのため、プロコンのために覚えるにはオススメしません。

C++, Java はそれぞれ長所短所があります。
どちらの言語でしか解けない問題があるということはありませんので、どちらでも構いません。

両方を使い分けるというのもいいですが、それはどちらかを十分に競技プログラミングで使えるようになってから考えましょう。

C++

長所

  • コーディング量が少なくて済む (事が多い)
  • (プロコン向けの) 参考書、参考サイト、解答例が豊富

短所

  • (Java に比べ) 標準ライブラリが貧弱
  • 言語仕様自体が複雑

Java

実行時間は C++ に劣りますが、同じアルゴリズムであれば、基本的に有利不利はないように調整されています。

AOJ では、C/C++ の2倍の時間をタイムリミットにしているそうです。

長所

  • 標準ライブラリが豊富
  • (C++ に比べて) 言語仕様が分かりやすい (と言われている)

短所

  • コーディング量が多くなりがち
  • (プロコン向けの) 参考書、参考サイト、解答例が少ない

*1 厳密に言うと、完全な互換性があるわけではありません。
*2 C言語自体が悪いわけではなく、C++/Java など豊富なライブラリを持つ言語には勝てないということです。
*3 例外的に JOI (日本情報オリンピック)、IOI (国際情報オリンピック) では Java は使えません。C/C++ が利用できます。