LoginSignup
3
1

More than 3 years have passed since last update.

scalaで競技プログラミングを入門する方法 ~標準入力~

Last updated at Posted at 2020-07-10

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の関数が使えることで、できることの幅が広がり、よりスピーディーによりスタイリッシュにコーディングすることが出来ます。

みんなもscalaやろうぜ!!!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1