Problem:
数当てゲーム (Unique number)

問題

JOI 君は友達とゲームをすることにした．このゲームには N 人のプレイヤーが参加する．1 回のゲームのルールは次のようなものである：

それぞれのプレイヤーは 1 以上 100 以下の好きな整数をカードに書いて提出する．各プレイヤーは，自分と同じ数を書いた人が他にいなかった場合，自分の書いた数と同じ得点を得る．自分と同じ数を書いた人が他にいた場合は得点を得られない．

JOI 君たちはこのゲームを 3 回行った．各プレイヤーが 3 回のゲームにおいて書いた数が与えられたとき，各プレイヤーが 3 回のゲームで得た合計得点を求めるプログラムを作成せよ．

入力

入力は 1 + N 行からなる．

1 行目には整数 N (2 ≦ N ≦ 200) が書かれており，プレイヤーの人数を表す．

続く N 行のうちの i 行目 (1 ≦ i ≦ N) には 3 つの 1 以上 100 以下の整数が空白を区切りとして書かれており，それぞれ i 人目のプレイヤーが 1 回目，2 回目，3 回目のゲームで書いた数を表す．

出力

出力は N 行からなる．

i 行目 (1 ≦ i ≦ N) には i 人目のプレイヤーが 3 回のゲームで得た合計得点を表す整数を出力せよ．

入出力例

入力例 1

5
100 99 98
100 97 92
63 89 63
99 99 99
89 97 98

出力例 1

0
92
215
198
89

入力例 1 では，各プレイヤーが 3 回のゲームで得た得点の詳細は次のようになる：

プレイヤー 1： 0 + 0 + 0 = 0

プレイヤー 2： 0 + 0 + 92 = 92

プレイヤー 3： 63 + 89 + 63 = 215

プレイヤー 4： 99 + 0 + 99 = 198

プレイヤー 5： 89 + 0 + 0 = 89

入力例 2

3
89 92 77
89 92 63
89 63 77

出力例 2

0
63
63

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in Scala (judge verdict: Accepted)

import scala.math._

object Main {
  val sc = new java.util.Scanner(System.in)
  def main(args: Array[String]) {
    val n = sc.nextInt()
    val a = Array.ofDim[Int](3, n)
    for(i <- 0 until n; j <- 0 until 3) {
      a(j)(i) = sc.nextInt()
    }
    val p = (for(i <- 0 until 3) yield {
      val g = a(i).zipWithIndex.groupBy(x => x._1)
      (for(j <- 0 until n) yield {
        if(g(a(i)(j)).size == 1) {
          a(i)(j)
        } else {
          0
        }
      }).toArray
    }).toArray
    for(i <- 0 until n) {
      println(p(0)(i) + p(1)(i) + p(2)(i))
    }
  }
}