Kazun の競プロ記録

競技プログラミングに関する様々な話題を執筆します.

AtCoder Beginner Contest 277 B問題 Playing Cards Validation

問題

atcoder.jp

提出解答

(解法1) atcoder.jp

(解法2) atcoder.jp

問題の概要

英大文字または数字からなる2文字の  N 個の文字列  S_1, \dots, S_N が与えられる.

 S_1, \dots, S_N は以下を満たすか?

  •  i=1,2, \dots, N に対して,  S_i の1文字目は  {\tt H}, {\tt D}, {\tt C}, {\tt S} のいずれかである.
  •  i=1,2, \dots, N に対して,  S_i の2文字目は  {\tt A}, {\tt 2}, {\tt 3}, {\tt 4}, {\tt 5}, {\tt 6}, {\tt 7}, {\tt 8}, {\tt 9}, {\tt T}, {\tt J}, {\tt Q}, {\tt K} のいずれかである.
  •  S_1, \dots, S_N は相異なる.

制約

  •  1 \leq N \leq 52
  •  S_i は英大文字または数字からなる

解法

 i=1,2, \dots, N それぞれについて  S_i の1文字目と2文字目が条件に該当するかを確認し, 重複が存在しないかどうかを確認すればよい.

これらには以下のような2つの方法が挙げられる.

  •  S_i の1文字目と2文字目が条件に該当するかを if 文で確認し, 重複が存在するかどうかを確認する. 重複の確認は愚直に行う方法や, 集合を利用して判定する方法がある.
  • 1文字目と2文字目が条件に該当する文字列は  4 \times 13=52 個なので, 先にこの文字列を全て生成し, 集合  E に記録する. 各  S_i について,  S_i \in E であるかどうかを確認し, そうならば  E から  S_i を削除するようにすれば重複も確認できる.