始めに
今までC++で競技プログラミングをしてきたのですが、業務でScalaを書いていることもあり、ScalaでAtCoderを解いてみようと思います。大半が解いたことある問題かつ、目的はScalaに慣れることなので、解説は省いています。
勉強途中であることもあり、より良い書き方とかあれば是非是非コメントにアドバイスお願いします!
記念すべき第一回は、"Welcome to AtCoder" です。
問題はこちら
解答
まず、空白区切りの数字は 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() }