ひらめの日常

プログラミングと読書と

Scalaで競技プログラミング ABC151-C Welcome to AtCoder

始めに

今までC++競技プログラミングをしてきたのですが、業務でScalaを書いていることもあり、ScalaAtCoderを解いてみようと思います。大半が解いたことある問題かつ、目的はScalaに慣れることなので、解説は省いています。
勉強途中であることもあり、より良い書き方とかあれば是非是非コメントにアドバイスお願いします! 記念すべき第一回は、"Welcome to AtCoder" です。

問題はこちら

atcoder.jp

解答

まず、空白区切りの数字は nextInt で受け取れる。空白区切りの文字列は next で受け取れる。

前半の入力では、まだACしていない問題に対してWAの数を加算していくようにしている。この部分は配列の要素を書き換えているので、上手な書き方が他にあるんだろうな(と言いつつ思い付かず)。

後半は取りあえず関数型っぽく foldRight で書いたけど、もっと綺麗にかける方法がないかと思っている。

object Main extends App {
  val pw = new java.io.PrintWriter(System.out)
  val sc = new java.util.Scanner(System.in)

  val n, m = sc.nextInt
  val aced = new Array[Boolean](n + 1)
  val penalty = new Array[Int](n + 1)

  (1 to m).foreach { _ =>
    val p = sc.nextInt
    val s = sc.next
    if (s == "AC") aced(p) = true
    else if (!aced(p)) penalty(p) = penalty(p) + 1
  }
  val (ac, wa) = aced.zip(penalty).foldRight((0, 0)) {
    case ((aced, penalty), (accAc, accPen)) =>
      if (aced) (accAc + 1, accPen + penalty)
      else (accAc, accPen)
  }

  pw.println(s"$ac $wa")
  pw.flush()
}

Submission #17657450 - AtCoder Beginner Contest 151