【競技プログラミング初心者の学び】入力をパースする、数える

はじめに

この記事では、初めてやる競技プログラミングの中で詰まったところをまとめていくシリーズです。 私が認知しているのは

  • AtCoder 1
  • LeetCode 2

ですが、ここ記事ではAtCoderを軸にします。

詰まったところ

main関数を忘れない

エントリーポイントはfun main() {...}で宣言します。Jupyter Notebookではmainを宣言しなくても実行できるので忘れがちなのですが、AtCoderではmainを宣言しないとコンパイルエラーになります。

パースする

AtCoderでは標準入力が連続で入ってくるので、その形式に則ってパースしなければなりません。 例えば、初心者用問題のWelcome to AtCoderでは

a
b c
s

という入力が与えられます。a, b, cIntsStringという感じです。 これは次のようにして変数に詰め込むことができます。

fun main() {
    val a = readln().toInt()
    val (b, c) = readln().split(" ").map { it.toInt() }
    val s = readln()
}

a, sは簡単なのですが、問題はb, cのように横に連なって入ってくる時です。ここではPair型として受け取ります。明示的にはval (b, c): Pair<Int, Int>と書きます。b cはスペースで区切られているので、split(" ")で分割し、map { it.toInt() }Intに変換しています。その後、val (b, c) = ...b, cにそれぞれ代入しています。

数える

101

のようなStringの標準有力があるとします。この文字列に含まれる1の数を数えたいです。 forで数えてもいいのですが、Kotlinらしく書くと

fun main() {
    val s = readln()
    val ans = s.count { it == '1' }
    println(ans)
}

です。

Footnotes

  1. https://info.atcoder.jp

  2. https://leetcode.com/