JavaのScannerクラスは遅い?

AtCoderのコンテストを引き続き参加中で、3/19にもちょっと参加してみた。

nulltemp.hatenablog.com

atcoder.jp

とりあえずA~Cまでは回答することが出来たが、D問題はなんどもTLEしてしまい回答することが出来なかった(結果はお察し)。

atcoder.jp

解説を見ても何が間違っているのか判断できず他の人のJavaの回答を見ていたが、みな結構Java標準のScannerを使っていないことに気が付いた。

試しに他の人の自作と思われるScannerを使って自分のプログラムを書き直してみたところ、最大2000ms程度だった実行時間が1700ms程度になり、TLEさせずに回答させることが出来た。

Scannerクラスが遅い原因についてはちゃんと調べていないが、恐らく多様な文字列等が入力されることを考慮して処理が複雑になっているのかなと想像している(逆に後述するIO用ライブラリは高速ではあるがASCII文字以外に対応していないらしい)。

プログラミングコンテストについて色々調べた感じだと「その言語標準のAPIを使うことで回答できなくなる(制限時間を超える)ような問題は基本的に出ないだろう」という意見をネットで見かけることもあったが、正直Javaについてはその限りではないのではないかという気がしてきた。

人によっては以下のようにコンテスト用のIO用コード(AtCoderが公開しているライブラリをJavaに書き直したもの)を公開している人もいるので、今後はこういったものを使うか別の言語で挑戦するのがいいのかもしれない。

github.com