Problem:
問題1

　三角形の形は辺の長さで決まる．
順番に３つの正整数が与えられたとき，
辺の長さがそれらの値と一致する三角形が存在するかどうかを調べ，
存在するなら鋭角三角形，直角三角形，鈍角三角形のいずれかを判定し，
次の入力へ進む．
三角形が存在しないとき，
それまでに入力された，三角形，直角三角形，鋭角三角形，鈍角三角形の
個数を空白で区切って出力し，
それ以降の入力は無視して終了する．
入力の中には必ず三角形が存在しないようなものがある
と仮定してよい.
入力の行数は判らないが各行には３つの正整数が空白で区切って書かれている．
ただし，各整数は100 以下とする.

出力ファイルにおいては，
出力の最後の行にも改行コードを入れること．

入出力例

入力例１

3 4 5
2 1 2
6 3 4
1 1 1
1 2 3

4 1 2 1

入力例２

3 4 5
2 1 2
6 3 4
1 2 3
1 1 1

出力例２

3 1 1 1

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

Solution in JAVA (judge verdict: Accepted)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);
		List<Triangle> triangleList = new ArrayList<>();
		while (stdIn.hasNextInt()) {
			triangleList.add(new Triangle(stdIn.nextInt(), stdIn.nextInt(), stdIn.nextInt()));
		}

		Counter c = new Counter(triangleList);
		stdIn.close();

		System.out.println(c.countLegalTriangle() + " " + c.countTriangle(TriangleType.RIGHT) + " "
				+ c.countTriangle(TriangleType.ACUTE_ANGLED) + " " + c.countTriangle(TriangleType.OBTUSE_ANGLED));
	}
}

class Counter {
	private Map<TriangleType, Integer> countMap = new EnumMap<>(TriangleType.class);

	public Counter(List<Triangle> triangleList) {
		for (Triangle triangle : triangleList) {
			try {
				add(triangle);
			} catch (IllegalArgumentException e) {
				break;
			}
		}
	}

	private void add(Triangle t) {
		TriangleType type = Triangle.secern(t);

		if (!countMap.containsKey(type)) {
			countMap.put(type, 1);
			return;
		}
		countMap.replace(type, countMap.get(type) + 1);
	}

	public int countLegalTriangle() {
		return countMap.entrySet().stream().filter(e -> e.getKey() != TriangleType.ILLEGAL).mapToInt(e -> e.getValue())
				.sum();
	}

	public long countTriangle(TriangleType t) {
		return countMap.entrySet().stream().filter(e -> e.getKey() == t).mapToInt(e -> e.getValue()).sum();
	}
}

class Triangle {
	private int first;
	private int second;
	private int third;

	public Triangle(int first, int second, int third) {
		int[] edges = { first, second, third };

		Arrays.sort(edges);
		// sorted
		this.first = edges[0];
		this.second = edges[1];
		this.third = edges[2];
	}

	public static boolean isTriangle(Triangle t) {
		return t.first + t.second > t.third;
	}

	public static TriangleType secern(Triangle t) {
		if (t == null) {
			throw new IllegalArgumentException("null NG");
		}

		if (!isTriangle(t)) {
			throw new IllegalArgumentException("null NG");
		}

		int former = t.first * t.first + t.second * t.second;
		int latter = t.third * t.third;

		if (former == latter) {
			return TriangleType.RIGHT;
		}

		return former > latter ? TriangleType.ACUTE_ANGLED : TriangleType.OBTUSE_ANGLED;
	}

	public int getFirst() {
		return first;
	}

	public int getSecond() {
		return second;
	}

	public int getThird() {
		return third;
	}

	@Override
	public String toString() {
		return "Triangle [first=" + first + ", second=" + second + ", third=" + third + "]";
	}
}

enum TriangleType {
	RIGHT, ACUTE_ANGLED, OBTUSE_ANGLED, ILLEGAL;
}