scalaで競技プログラミングを入門する方法 ~標準入力~
この記事では競技プログラミングでscala使いたいけど、標準入力の仕方がわからない方向けの記事となります。
すでにこの手の記事はありますが、いろいろな問題に適応できなかったため、執筆する運びになりました。
scalaの標準入力とJavaの標準入力
scalaでは通常、標準入力を
io.StdIn.readLine
などで行うことが出来ます。
しかし、これはあまり使いやすくなく Javaの標準入力のほうが競技プログラミングでは書きやすいです。
なのでJavaの標準入力を使うために
val sc = new java.util.Scanner(System.in)
でインスタンス化しておきます。
それでは、問題別に標準入力の方法を紹介していきます。
Int型
このような問題では、Int型の整数を一つ入力します。
やり方は
var r = sc.nextInt()
このようになります。
https://atcoder.jp/contests/abc164/tasks/abc164_a
こちらの問題では、Int型の整数を複数個入力します。
やり方は
var s , w = sc.nextInt()
とcomma(,)を挟むことによってスペースで区切られた整数を一つずつ宣言して入力できます。
String型
https://atcoder.jp/contests/abc166/tasks/abc166_a
この問題では、String型の文字列を一つ入力します。
やり方は
var s = sc.next()
このようになります。
問題は見つけられませんでしたが文字列複数個のときもIntのときと同様に
var s , w = sc.next()
とするとスペースで自動で区切られ2つの文字列を入力できます。
Array型
この問題では配列を使って複数個、整数を入力します
やり方は
var a = Array.fill(n)(sc.nextInt)
このように、fillを使って埋めます1つ目のカッコに要素数、2つ目に先程の標準入力を書きます
こちらは二次元配列を使う問題です
残念ながら二次元配列ではあまりスマートに書くことが出来ません
var a = Array.ofDim[Int](3, 3)
for (i <- 0 until 3){
a(i) = Array.fill(3)(sc.nextInt())
}
このようにfor文を使います。
はじめにArray.ofDim[Int](3, 3)
を使って要素数3,3の二次元配列を作ります。
その後、forを回し、先程の一次元配列の要領で入力させます。
scalaでのList
Listはあまり計算速度が早くありません。
例えばfillを使って埋めるときなど、配列の2倍ほどの速度がかかってしまいます。
なのでなるべくListではなくArrayを使っていきましょう。
終わりに
現在atcoderではscalaで書いている人があまり多くはありませんしかし、scalaはpythonなどと比べ早い言語であり、C++などに比べ標準関数が豊富です。
scalaの関数とJavaの関数が使えることで、できることの幅が広がり、よりスピーディーによりスタイリッシュにコーディングすることが出来ます。