Problem:
Problem C: ラミー

あなたの友達は最近 UT-Rummy というカードゲームを思いついた．

このゲームで使うカードには赤・緑・青のいずれかの色と1から9までのいずれかの番号が
つけられている．
このゲームのプレイヤーはそれぞれ9枚の手札を持ち，
自分のターンに手札から1枚選んで捨てて，
代わりに山札から1枚引いてくるということを繰り返す．
このように順番にターンを進めていき，
最初に手持ちのカードに3枚ずつ3つの「セット」を作ったプレイヤーが勝ちとなる．
セットとは，同じ色の3枚のカードからなる組で，すべて同じ数を持っているか
連番をなしているもののことを言う．
連番に関しては，番号の巡回は認められない．
例えば，7, 8, 9は連番であるが 9, 1, 2は連番ではない．

あなたの友達はこのゲームをコンピュータゲームとして売り出すという計画を立てて，
その一環としてあなたに勝利条件の判定部分を作成して欲しいと頼んできた．
あなたの仕事は，手札が勝利条件を満たしているかどうかを判定する
プログラムを書くことである．

Input

入力の1行目にはデータセット数を表す数 T
(0 < T ≤ 50) が与えられる．
この行に引き続き T 個のデータセットが与えられる．

各データセットは2行からなり，
1行目には i 番目
(i = 1, 2, ..., 9)
のカードの数字 ni
がそれぞれスペースで区切られて与えられ，
2行目には i 番目のカードの色を表す文字
ci
がそれぞれスペースで区切られて与えられる．
カードの数字
ni
は 1 ≤ ni ≤ 9
を満たす整数であり，
カードの色 ci
はそれぞれ “R”, “G”,
“B”
のいずれかの文字である．

1つのデータセット内に色と数字がともに同じカードが5枚以上出現することはない．

Output

各データセットにつき，勝利条件を満たしていれば
“1”，
そうでなければ “0” と出力せよ．

Sample Input

5
1 2 3 3 4 5 7 7 7
R R R R R R G G G
1 2 2 3 4 4 4 4 5
R R R R R R R R R
1 2 3 4 4 4 5 5 5
R R B R R R R R R
1 1 1 3 4 5 6 6 6
R R B G G G R R R
2 2 2 3 3 3 1 1 1
R G B R G B R G B

Output for the Sample Input

1
0
0
0
1

Solution in JAVA (judge verdict: Accepted)

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		int num[] = new int[9];
		int color[] = new int[9];
		// TODO 自動生成されたメソッド・スタブ
		Scanner scanner = new Scanner(System.in);
		// 回数counter入力
		int counter = scanner.nextInt();

		// カードの配列numとcolorの定義と入力、格納
		for (int trial = 0; trial < counter; trial++) {
			int rednum = 0;
			int greennum = 0;
			int bluenum = 0;

			for (int hand = 0; hand < 9; hand++) {
				num[hand] = scanner.nextInt();
			}
			for (int hand = 0; hand < 9; hand++) {
				String input = scanner.next();
				if ("R".equals(input)) {
					color[hand] = 1;
					rednum++;
				} else if ("G".equals(input)) {
					color[hand] = 2;
					greennum++;
				} else if ("B".equals(input)) {
					color[hand] = 3;
					bluenum++;
				}
			}
			// 色R,G,Bの配列の定義
			int[] red = new int[rednum];
			int[] green = new int[greennum];
			int[] blue = new int[bluenum];
			int redindex = 0;
			int greenindex = 0;
			int blueindex = 0;

			// 色配列にnumの要素を格納
			for (int i = 0; i < 9; i++) {
				if (color[i] == 1) {
					red[redindex] = num[i];
					redindex++;
				} else if (color[i] == 2) {
					green[greenindex] = num[i];
					greenindex++;
				} else if (color[i] == 3) {
					blue[blueindex] = num[i];
					blueindex++;
				}
			}
			// 色配列をソート
			Arrays.sort(red);
			Arrays.sort(green);
			Arrays.sort(blue);

			// カードの合計セット数setcountとcountメソッドの宣言、初期化
			int setcount = 0;
			setcount += count(red);
			setcount += count(green);
			setcount += count(blue);

			// setcountが3なら1、それ以外なら0を出力
			if (setcount == 3) {
				System.out.println(1);
			} else {
				System.out.println(0);
			}
			//System.out.println(setcount);

		}

	}

	public static int count(int a[]) {
		List<Integer> list = new LinkedList<Integer>();
		for (int i = 0; i < a.length; i++) {
			list.add(a[i]);
		}

		int setcounter = 0;
		int listsize = a.length;
		// 総当たりで判定
		for (int i1 = 0; i1 < listsize - 2; i1++) {
			for (int i2 = i1 + 1; i2 < listsize - 1; i2++) {
				for (int i3 = i2 + 1; i3 < listsize; i3++) {
					if (i1 != i2 && i1 != i3 && i2 != i3) {
						if (list.get(i1) + 1 == list.get(i2)
								&& list.get(i1) + 2 == list.get(i3)) {
							list.remove(i3);
							list.remove(i2);
							list.remove(i1);
							setcounter++;
							listsize = list.size();
							i2 = i1 + 1;
							i3 = i2;
						} else if (list.get(i1) == list.get(i2) && list.get(i1) == list.get(i3)) {
							list.remove(i3);
							list.remove(i2);
							list.remove(i1);
							setcounter++;
							listsize = list.size();
							i2 = i1 + 1;
							i3 = i2;
						}
					}
				}
			}
		}
		//for (int s : list) {
		//	System.out.println(s);
		//}
		return setcounter;
	}
}