寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

C言語による不足したカードの発見

C言語による不足したカードの発見です。
n 枚のトランプのカードから、足りないカードを出力するプログラムです。

・問題
 太郎が花子と一緒にトランプ遊びをしようとしたところ、52枚あるはずのカードが n 枚のカードしか手元にありません。
 これらの n 枚のカードを入力として、足りないカードを出力するプログラムを作成して下さい。
 太郎が最初に持っていたトランプはジョーカーを除く52枚のカードです。
 52枚のカードは、スペード、ハート、クラブ、ダイヤの4つの絵柄に分かれており、各絵柄には13のランクがあります。

・入力される値
 最初の行に太郎が持っているカードの枚数 n (n ≤ 52)が与えられます。
 続いて n 組のカードがそれぞれ1行に与えられます。
 各組は1つの空白で区切られた文字と整数です。
 文字はカードの絵柄を表し、スペードが'S'、ハートが'H'、クラブが'C'、ダイヤが'D'で表されています。
 整数はそのカードのランク(1 〜 13)を表しています。

・期待する出力
 足りないカードをそれぞれ1行に出力して下さい。
 各カードは入力と同様に1つの空白で区切られた文字と整数です。
 出力するカードの順番は以下のとおりとします:
   絵柄がスペード、ハート、クラブ、ダイヤの順番で優先的に出力する。
   絵柄が同じ場合は、ランクが小さい順に出力する。

僕が作成、提出したコードは、以下のとおりです。

/*
 ITP1_6_B : Finding Missing Cards
 http://judge.u-aizu.ac.jp/
 C言語による不足したカードの発見
 https://neguse-atama.hatenablog.com
*/
#include<stdio.h>
int main(void){
    static int cards[4][13];
    int i,j,n,m;
    char c;
    char s[5]={'S','H','C','D','\0'};
    scanf("%d\n",&n);
    for(i=0;i<n;i++){
        scanf("%c %d\n",&c,&m);
        for(j=0;j<4;j++)
            if(s[j]==c){
                cards[j][m-1]=1;
            }
    }
    for(i=0;i<4;i++){
        for(j=0;j<13;j++){
            if(cards[i][j]==0)
                printf("%c %d\n",s[i],j+1);
        }
    }
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/
ITP1_6_B : Finding Missing Cards