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;

public class Main {
	
	private static final int NUM_HAND_CARD = 5;
	public static void main(String[] arg){
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int[] hand = new int[NUM_HAND_CARD];
		ArrayList<String> result = new ArrayList<String>();
		try{
			while(true){
				String[] input = br.readLine().split(",");
				for(int i = 0; i < NUM_HAND_CARD; i++){
					hand[i] = Integer.parseInt(input[i]);
				}
				result.add(judgeHand(hand));
			}
		}catch(Exception e){
			//何もしないで出力処理に移る
		}
		
		for(String pair : result){
			System.out.println(pair);
		}
	}
	
	public static String judgeHand(int[] hand){
		Arrays.sort(hand);
		if(isFourCard(hand)){
			return "four card";
		}
		else if(isFullHouse(hand)){
			return "full house";
		}
		else if(isStraight(hand)){
			return "straight";
		}
		else if(isThreeCard(hand)){
			return "three card";
		}
		else if(isTwoPair(hand)){
			return "two pair";
		}
		else if(isOnePair(hand)){
			return "one pair";
		}
		else{
			return null;
		}
	}
	
	private static boolean isFourCard(int[] hand){
		return isPair(hand ,4, 1);
	}
	
	private static boolean isFullHouse(int[] hand){
		if(isOnePair(hand) && isThreeCard(hand)){
			return true;
		}
		else{
			return false;
		}
	}

	private static boolean isStraight(int[] hand){
		int[] tmpHand = new int[NUM_HAND_CARD];
		for(int i = 0; i < NUM_HAND_CARD; i++){
			tmpHand[i] = hand[i];
			if(tmpHand[i] == 1){
				tmpHand[i] = 14;
			}
		}
		Arrays.sort(tmpHand);
		return checkNumbersStraight(hand) || checkNumbersStraight(tmpHand);
	}
	
	private static boolean checkNumbersStraight(int[] hand){
		int numStart = hand[0];
		for(int i = 1; i < NUM_HAND_CARD; i++){
			if(++numStart != hand[i]){
				return false;
			}
		}
		return true;
	}

	private static boolean isThreeCard(int[] hand){
		return isPair(hand, 3, 1);
	}

	private static boolean isTwoPair(int[] hand){
		return isPair(hand, 2, 2);
	}

	private static boolean isOnePair(int[] hand){
		return isPair(hand, 2, 1);
	}
	
	//同じカードnumCard枚のペアがnumPair組あるか判定する
	private static boolean isPair(int[] hand, int numCard, int numPair){
		//Arrays.sort(hand);
		int pairCount = 0;
		for(int n = 1; n <= 13; n++){
			int count = 0;
			for(int i = 0; i < NUM_HAND_CARD; i++){
				if(hand[i] == n){
					count++;
				}
			}
			if(count == numCard){
				pairCount++;
			}
		}
		if(pairCount == numPair){
			return true;
		}
		else{
			return false;
		}
	}

}