AOJ volume10015 Finding Missing Cards

import java.util.Scanner;

public class FindingMissingCards{
	private static final int MAX_CARDS = 52;
	private static final int NUM_SUIT = 4;
	private static final int MAX_CARD_NUMBER = 13;
	
	private static final int SPADE = 0;
	private static final int HEART = 1;
	private static final int CLUB = 2;
	private static final int DIA = 3;
	
	private static final int EXIST = 1;
	private static final int MISSING = 0;
	
	private static Scanner sc = new Scanner(System.in);
	
	private static int numCards = MAX_CARDS;
	private static  int[][] cards = new int[NUM_SUIT][MAX_CARD_NUMBER + 1];
	
	public static void main(String[] args) {
		initializeCardsState();
		numCards = getNumCards();
		checkNumCards(numCards);
		setAllCardsExist();
		printMissingCards();
	}
	
	private static void printMissingCards(){		
		//手元にないカードを出力する
		for(int i = 0; i < NUM_SUIT; i++){
			for(int j = 1; j < MAX_CARD_NUMBER + 1; j++){
				printMissingCard(i, j);
			}
		}
	}
	
	private static void checkNumCards(int n){
		if(!(0 < n && n <= MAX_CARDS )){
			System.out.println("1〜52までの自然数を入力してください");
			System.exit(0);
		}
	}
	
	private static int getNumCards(){
		int n = 0;
		if(sc.hasNextInt()){
			n = sc.nextInt();
		}
		else{
			System.out.println("自然数以外が入力されています");
			System.exit(0);
		}
		
		return n;
	}
	
	private static void setCardExist(){
		char suit = 'a';
		int n = 0;
		
		if(sc.hasNext()){
			suit = sc.next().charAt(0);
		}
		
		if(sc.hasNextInt()){
			n = sc.nextInt();
		}
		
		switch(suit){
		case 'S':
			cards[SPADE][n] = EXIST;
			break;
		case 'H':
			cards[HEART][n] = EXIST;
			break;
		case 'C':
			cards[CLUB][n] = EXIST;
			break;
		case 'D':
			cards[DIA][n] = EXIST;
			break;
		default:
			System.out.println("S, H, C, D いずれかを入力してください");
			System.exit(0);
		}
	}
	
	private static void setAllCardsExist(){
		//手元にあるカードをcard配列で表現する
		int i = 0;
		while(i < numCards){
			//入力から手元にあるカードを受け取る
			setCardExist();
			i++;
		}
	}
	
	private static void printMissingCard(int i, int j){
		if(cards[i][j] == EXIST){
			//カードが存在する場合は何も出力しない
		}
		else{
			System.out.printf("%s %d\n", getSuit(i), j);
		}
	}
	
	private static void initializeCardsState(){
		for(int i = 0; i < NUM_SUIT; i++){
			for(int j = 0; j < MAX_CARD_NUMBER; j++){
				cards[i][j] = MISSING;
			}
		}
	}
	
	private static char getSuit(int n){
		switch(n){
		case SPADE:
			return 'S';
		case HEART:
			return 'H';
		case CLUB:
			return 'C';
		case DIA: 
			return 'D';
		default:
			return ' ';
		}
	}
}