Problem:
ポーカー

ポーカーの手札データを読み込んで、それぞれについてその役を出力するプログラムを作成してください。ただし、この問題では、以下のルールに従います。

ポーカーはトランプ 5 枚で行う競技です。

同じ数字のカードは 5 枚以上ありません。

ジョーカーは無いものとします。

以下のポーカーの役だけを考えるものとします。(番号が大きいほど役が高くなります。)

役なし(以下に挙げるどれにも当てはまらない)

ワンペア（2 枚の同じ数字のカードが1 組ある）

ツーペア（2 枚の同じ数字のカードが2 組ある）

スリーカード（3 枚の同じ数字のカードが1 組ある）

ストレート（5 枚のカードの数字が連続している）

ただし、A を含むストレートの場合、A で終わる並びもストレートとします。つまり、A を含むストレート
は、A 2 3 4 5 　と　10 J Q K A 　の２種類です。J Q K A 2 などのように、A をまたぐ並び
はストレートではありません。（この場合、「役なし」になります）。

フルハウス（3 枚の同じ数字のカードが1 組と、残りの2 枚が同じ数字のカード）

フォーカード（4 枚の同じ数字のカードが1 組ある）

Input

入力は複数のデータセットからなります。各データセットは以下の形式で与えられます。

手札1,手札2,手札3,手札4,手札5

手札は、トランプのJ(ジャック) を11、Q(クイーン) を12、K(キング) を13、A（エース）を 1、その他はそれぞれの数字で表すこととします。

データセットの数は 50 を超えません。

Output

データセットごとに、手札によってできる最も高い役をひとつ出力してください。役の表記については出力例に従ってください。

Sample Input

1,2,3,4,1
2,3,2,3,12
12,13,11,12,12
7,6,7,6,7
3,3,2,3,3
6,7,8,9,10
11,12,10,1,13
11,12,13,1,2

Output for the Sample Input

one pair
two pair
three card
full house
four card
straight
straight
null

3 3 2 3 3 という手札であったときは、two pair ではなく four card です。

Solution in JAVA (judge verdict: Accepted)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = "";

		while ((line = br.readLine()) != null) {

			ArrayList<Integer> cardsArray = new ArrayList<Integer>();
			HashMap<Integer, Integer> cardsHash = new HashMap<Integer, Integer>();

			// 手札読み込み
			for (String s : line.split(",")) {
				int i = Integer.parseInt(s);
				//
				cardsArray.add(i);
				//
				if (cardsHash.containsKey(i)) {
					cardsHash.put(i, cardsHash.get(i) + 1);
				} else {
					cardsHash.put(i, 1);
				}
			}
			// 役判定
			if (isFourCard(cardsHash)) {
				System.out.println("four card");
			} else if (isFullHouse(cardsHash)) {
				System.out.println("full house");
			} else if (isStraight(cardsArray)) {
				System.out.println("straight");
			} else if (isThreeCard(cardsHash)) {
				System.out.println("three card");
			} else if (isTwoPair(cardsHash)) {
				System.out.println("two pair");
			} else if (isOnePair(cardsHash)) {
				System.out.println("one pair");
			} else {
				System.out.println("null");
			}
		}
	}

	public static boolean isFourCard(HashMap<Integer, Integer> cards) {
		if (cards.containsValue(4))
			return true;
		return false;
	}

	public static boolean isFullHouse(HashMap<Integer, Integer> cards) {
		if (cards.containsValue(3) && cards.containsValue(2))
			return true;
		return false;
	}

	public static boolean isStraight(ArrayList<Integer> cards) {
		Integer[] temp = cards.toArray(new Integer[] {});
		Arrays.sort(temp);

		boolean result = true;

		for (int i = 0; i < 4; i++) {
			if (temp[i + 1] - temp[i] == 1)
				result &= true;
			else
				result = false;
		}

		if (temp[0] == 1 && temp[1] == 10 && temp[2] == 11 && temp[3] == 12
				&& temp[4] == 13)
			result = true;

		return result;
	}

	public static boolean isThreeCard(HashMap<Integer, Integer> cards) {
		if (cards.containsValue(3))
			return true;
		return false;
	}

	public static boolean isTwoPair(HashMap<Integer, Integer> cards) {
		int count = 0;
		for (Integer v : cards.values()) {
			if (v == 2)
				count++;
		}
		return count == 2 ? true : false;
	}

	public static boolean isOnePair(HashMap<Integer, Integer> cards) {
		int count = 0;
		for (Integer v : cards.values()) {
			if (v == 2)
				count++;
		}
		return count == 1 ? true : false;
	}
}