Problem:
じゃんけん

仲良し 5 人組でじゃんけんをすることになりました。じゃんけんとは、グー、チョキ、パーという 3つの手があり、グーとチョキの勝負ならグーが「勝ち」・チョキが「負け」、チョキとパーなら、チョキが「勝ち」・パーが「負け」、パーとグーならパーが「勝ち」・グーが「負け」というルールです。全員が同じ手、またはグー、チョキ、パー全てが出た場合は「あいこ」となります。

5 人のじゃんけんの手を入力とし、それぞれの人の勝敗を出力するプログラムを作成してください。じゃんけんの手は、グーは 1、チョキは 2、パーは 3 の数字で表します。勝敗は「勝ち」を 1、「負け」を 2、「あいこ」を 3 の数字で表し、入力順に従って出力します。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットは以下の形式で与えられます。

h1
h2
h3
h4
h5

i 行目に i 人目の手 hi (1, 2 または 3) が与えられます。

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

Output

入力データセットごとに、5 人の勝敗を出力します。i 行目に i 人目の勝敗(1, 2 または 3) を出力してください。

Sample Input

1
2
3
2
1
1
2
2
2
1
0

Output for the Sample Input

3
3
3
3
3
1
2
2
2
1

Solution in JAVA (judge verdict: Accepted)

import java.awt.geom.Point2D;
import java.lang.reflect.Array;
import java.math.BigInteger;
import java.util.*;

public class Main {	
	Scanner in = new Scanner(System.in);
	public static void main(String[] args){
		new Main();
	}
	public Main(){		
		new AOJ0205();
	}

	class AOJ0205{
		public AOJ0205() {
			while(true){
				int[] janken = new int[5];
				int[] result = new int[5];
				int a = in.nextInt();
				if(a==0)break;
				janken[0]=a;
				boolean g=false,t=false,p=false;
				if(janken[0]==1)g=true;
				else if(janken[0]==2)t=true;
				else if(janken[0]==3)p=true;
				for(int i=1;i<5;i++){
					janken[i]=in.nextInt();
					if(janken[i]==1)g=true;
					else if(janken[i]==2)t=true;
					else if(janken[i]==3)p=true;
				}
				if((g&&t&&p)||(g&&!t&&!p)||(!g&&t&&!p)||(!g&&!t&&p))for(int i=0;i<5;i++)result[i]=3;//あいこ
				else if(g&&t&&!p)for(int i=0;i<5;i++){
					if(janken[i]==1)result[i]=1;
					else result[i]=2;
				}else if(g&&!t&&p)for(int i=0;i<5;i++){
					if(janken[i]==3)result[i]=1;
					else result[i]=2;
				}else if(!g&&t&&p)for(int i=0;i<5;i++){
					if(janken[i]==2)result[i]=1;
					else result[i]=2;
				}
				for(int i=0;i<5;i++)System.out.println(result[i]);
			}
			
			
		}
	}

	class AOJ2503{
		int MAX = 0;
		public AOJ2503() {
			Scanner in = new Scanner(System.in);
			int n = in.nextInt();
			int m = in.nextInt();

			int[][] cost = new int[n][n];

			int[] dp = new int[n];
			for(int i=0;i<n*n;i++){
				cost[i/n][i%n]=MAX;
			}
			for(int i=0;i<m;i++){
				int a = in.nextInt();
				int b = in.nextInt();
				cost[a][b]=in.nextInt();
			}	
			//			TODO 一番大きいパスを0のポイントからn-1のポイントまでの

			for(int s=1;s<n;s++){
				for(int i=0;i<=s;i++){
					if(cost[i][s]==MAX)continue;
					dp[s]=Math.max(dp[s],dp[i]+cost[i][s]);
				}
			}
			for(int s=0;s<n;s++)for(int i=0;i<n;i++){
				if(cost[s][i]==MAX)continue;
				dp[i]=Math.max(dp[s]+cost[s][i],dp[i]);
			}
			for(int i=0;i<n;i++)System.out.print(dp[i]+" ");
			System.out.println();
			System.out.println(dp[n-1]);
		}
	}
}