Kotlinで競技プログラミングをやりたいと思ったので覚書に
文法等は別の記事に丁寧にまとめられているのでそちらを参照下さい
はじめよう、Kotlin(基本編)
指摘等コメントで頂けると幸いです
入力
一行に一つ
readLine()
を利用します
val s = readLine() //String
val n = readLine()!!.toInt() // Int
readLine()
は入力を文字列として返す関数なので、数値として扱う場合は別途キャストを入れてください(double等も同様)
ちなみにInteger.parseInt()
でキャストする方法もあります。若干こちらが早いです
大量の数値の入力を受け取る場合はこちらを使うのもよいかもしれません
↓"0"を数値にキャストしたときの処理速度の違い(measureNanoTime
関数で測定)
一行に複数
a b c
のように空白区切りになっている入力です
split()
を利用します
val s = readLine()!!.split(" ") // List<String>
val n = readLine()!!.split(" ").map(String::parseInt) // List<Int>
split()
はPython等と違い空白文字でも引数が必要な点に留意してください
各値のキャストはmap()
にparseInt
を渡すことで簡潔に行えます
このままでは不便なので各値を変数にばらしますが、ここでKotlinの便利な機能が利用できます
val (s1, s2, s3) = readLine()!!.split(" ") // String
val (n1, n2, n3) = readLine()!!.split(" ").map(String::parseInt) // Int
変数名を括弧で囲んで複数指定することで、配列の各値が順番に代入されます
複数行に一つ
a
b
c
のように改行区切りで入力されるパターンです
List生成時にブロックをくっつけることで値の代入が同時に行えます
val s = List(n) { readLine() } // List<String>
val num = List(n) { readLine()!!.toInt() } // List<Int>
もちろん上記で紹介した複数変数への代入も可能です
val (s1, s2, s3) = List(n) { readLine() } // String
val (n1, n2, n3) = List(n) { readLine()!!.toInt() } // Int
複数行に複数
a b c
d e f
g h i
みたいなのです
多次元配列に格納する形とします
val s = List(n) { // List<List<String>>
readLine()!!.split(" ")
}
val num = List(n) { // List<List<Int>>
readLine()!!.split(" ").map(String::parseInt)
}