はじめに
競技プログラミング (競プロ) でよく使用されるプログラミング言語といえばC++やPython (pypy) などが挙げられるでしょう。そう、競プロでJavaを使用するのはどちらかといえばマイノリティーに分類されます。
とはいえ、この記事にたどり着いたという事は、何かしらの理由で競プロでJavaを使う事を検討しているのではないでしょうか。実は私も数年前、同じ立場にいて、そのうえでJavaで競プロを始める事を選んだ人間です。
そこで、この記事では、実際に競プロでJavaを使っていて感じた事を解説していきたいと思います。「競プロでJavaを使ってみても大丈夫かな」と不安になっている方に届きますように。
※競プロといっても色々なサイト・大会がありますが、ここでは筆者がメインで参加しているAtcoderに絞った話をします。
目次
・筆者について
・私がJavaを選んだ理由
・実際にJavaを使ってみてどうか
・結論
筆者について
・競プロ歴5年 (アクティブに参加し始めたのはここ2年くらい)
・競プロでの使用言語: Java
・Atcoderレート帯: 緑
以上はすべて2024年2月現在における情報です。
私がJavaを選んだ理由
シンプルに「Javaしかプログラミング言語を知らなかった」からです。経緯としては、プログラミングやってみたい → 有名だからJavaやってみるか → 競プロっていうものがあるらしいぞ → あれ、あまりJavaはメインではないらしい?→まあ他に言語しらないしいいか、の流れですね。そのため、もしかしたら「Javaを選んだ」というより「Javaしか選べなかった」の方が近いかもしれません。ただし、Javaは有名な言語だから、言語自体の解説記事は多いし、著しく不便な事はないだろう、という予想はありました。
ただ、動悸が雑だったとはいえ、一応レート緑になるまで競プロをやっているので、ある程度Javaの使い心地は分かっているつもりです。
実際にJavaを使ってみてどうか
結論から言いますと、「別にJavaを使っていても問題はない」です。当たり前の事ですが、Atcoderでのコンテストは選択肢にあるどの言語を使ってもAC (正解) できるように問題が作られています。そのため、「Javaを使っていたから問題が解けなかった」という事はないはずです。
ただ、もちろん気を付けなければいけない事は数点あります。
1. Atcoder公式のAtcoder Libraryを使えない。
例えばC++を使う場合、Atcoder公式が提供しているAtcoder Libraryを使う事が出来ます。これは、競技プログラミングでよく使われる様々な便利な関数が入った便利なライブラリです。しかし、このライブラリはJava版の提供はありません。そのため、公式ライブラリを使いたい場合はC++を使う方が便利でしょう。
※有志の方が作ってくださったJava版Atcoder Libraryは公開されています (https://github.com/NASU41/AtCoderLibraryForJava)。
2. 解説に書いてあるサンプルコードが読めない
コンテスト終了後、各問題に対しての解説記事が公式から公開されます。しかし、そこに書いてあるサンプルコードはほぼ全てC++ (たまにpythonで併記)で書かれていて、Javaで書いてあるものは見たことがありません。それもそのはず、Atcoderのコンテストでは過半数の人がC++を使っており、Pythonの使用割合は1~2割、Javaにいたっては5%以下となっています。さすがにそれで公式解説でJavaが使用される事はないですよね。
ただし、これは「サンプルコードが読めない」というだけであって、解説記事自体は言語に関係なくアルゴリズムの解説をしてあるので読むことができます。むしろ、サンプルコードを読んで満足せず、自分で実装をしてみるモチベがわく…といえばむしろメリットかもしれません(?) 例え実装で困ったとしても、十中八九他の参加者がすでにJavaでACできるコードを提出しているため、そのコードを参考にする事が出来ます。
また、言語が違うとはいえJavaとC++の文法は似ているため、サンプルコードを「何となくこんな感じかな」と眺める事はできます。
3. 言語仕様、言語の特性でのメリット・デメリット
これは、どの言語にもいえる事ですが、言語によってできる事・できない事があります。
Javaを使うメリットとしては、言語自体の解説記事が多い事です。競プロ界隈でこそ使用者数が少ない言語ですが、界隈外を見れば多くの人が使用している言語です。そのため、初心者用学習サイト、初心者用解説記事、などもたくさんあります。そのため、Javaはすごく始めやすい言語、と言えるでしょう。また、業務でのプロダクト開発でもよく利用されている言語のため、競プロで培った知識を業務で活かしやすいとも言えます。
もちろん、逆にJavaだからこそできない事もあります。例えば、JavaはC++に比べると実行時間が長いため、実行時間ぎりぎりアルゴリズムを実装した際やヒューリスティック系のコンテストに参加した際に、C++ではACできてもJavaではTLE (実行時間制限超過) してしまう可能性があります。
他にも、Pythonでは整数int型に最大値がない事を利用して、ごり押しで解ける問題が過去にありました (ネタバレ防止のためどの問題か明言は避けます)
このように、「(言語名)を使っていたらこの問題楽に解けたのに…」となってしまう可能性はあります。ただし、これはどの言語にも言える事です。また、繰り返しになりますがAtcoderでのコンテストはどの言語を選択してもACできるようになっているので、Javaを使っていたせいで詰んでしまう、という事はありません。
結論
以上で述べた通り、Javaで競プロに参加する事には何の問題もないです。そのため、「競プロを始めてみたいけどJavaはダメなのか…」「Javaなら使えるのに、C++を新しく学ばなければいけないのか…」となっている人がいたら、私は「十分Javaで始めて大丈夫だよ」と言うでしょう。「始めるハードルを高くするくらいならJavaで始めた方がいい」というのが私の考えです。
しかし、Javaがマイナーな言語であるため、様々な注意点があるのは事実です。そのため、もし競プロをC++で始めるという選択肢があるのならC++の方をおすすめしますし、Java未学習の人にわざわざJavaはおすすめしません。