二次元配列による解法

以下のように、持っているカードの状態を、初期値を False とする 4 × 13 の2次元配列(リスト)に記録します。

cards = [[False for i in range(13)] for j in range(4)]

配列の縦方向が絵柄、横方向がランクに対応します。この場合縦方向のインデックスは以下のように対応させます:

0: S
1: H
2: C
3: D

絵柄のリストを定義することで、簡潔な記述で絵柄の情報にアクセスすることができます。

pattern = ["S", "H", "C", "D"]

たとえば、cards[2][4] が True の場合、絵柄がクラブ( pattern[2] すなわち "C" )、ランクが 5(0オリジンなので 4 + 1 = 5)のカードを持っている、という状態にします。

入力情報をもとに cards[i][j] の状態を記録し、cards[i][j] が False のカードを順番に出力します。

まずは、入力情報をもとに cards[i][j] の状態を記録していきます。たとえば、入力がH xであれば cards[1][x-1] が True となるようにします。

Pythonでは、index メソッドを使うことで要素のインデックスを取得することができます。絵柄の入力情報を ch 、ランクの入力情報を rank とすると、2重ループ内で以下のように書くことができます:

cards[pattern.index(ch)][rank-1] = True

たとえば、絵柄の入力情報 ch が "H" とすると pattern.index(ch) は、リスト pattern における "H" のインデックスである 1 を返します。

次に cards[i][j] が False のカードを順番に出力します。このとき、出力の順番の条件を満たすように、 i を 0 から 3 、 j を 0 から 12 まで回す2重ループで出力します。このとき、2重ループ内は以下のように書くことができます:

if cards[i][j] == False:
    print(pattern[i], j+1)

リストのin演算子による解法

リスト内の要素の確認を行うin演算子を用いれば、存在するカードをリストに保持し、不足している要素を判断することができます。

たとえば、各カードに以下のように番号付けします。

# rank   1  2  3  4  5  6  7  8  9 10 11 12 13
#---------------------------------------------
# S:     1  2  3  4  5  6  7  8  9 10 11 12 13
# H:    14 15 16 17 18 19 20 21 22 23 24 25 26
# C:    27 28 29 30 31 32 33 34 35 36 37 38 39
# D:    40 41 42 43 44 45 46 47 48 49 50 51 52

リストcardsの中に1 から52の整数が存在するかどうかは以下のように確認することができます:

for i in range(1,53):
    if not (i in cards):
        # cards にiが存在しない場合の処理

Reference

 

オンラインジャッジではじめるC/C++プログラミング入門 (マイナビ)

AIZU ONLINE JUDGE のコース問題を題材にした解説書です。各トピックごとに C/C++ 言語の基礎的な内容を学習し、Introduction to Programming の演習問題にチャレンジしていきます。内容は敷居の高いものではなく、プログラミング初学者が取り組む例題からスタートしています。