この記事では前回も扱ったABC211 B問題の別解をご紹介します。(たったの2行だけで完結するコードです!)
AtCoder Beginner Contest 211 B-Cycle Hit
【Pythonでの解法】
まず解答例を下に示します。
S = [input() for _ in range(4)] print("Yes" if len(set(S)) == 4 else "No")
1. 問題文の把握
題意の把握は前回と同じ内容になるため割愛します。
2. コードを考える
(0) 標準入力
前回と同様に、リスト内包表記を使って改行区切りで与えられた4つの文字列を1つのリストに格納します。
S = [input() for _ in range(4)]
(1) 根幹
所与の文字列群にH,2B,3B,HRの全てがあるかどうかを判定するには、それらを格納したリストの要素数を調べることで事足ります。ただし、純粋にリストSではなくset
を用います。set(リスト名)
とすることで、当該リストの要素のうち重複するものは1つに集約されます。
そこで、set(S)
の要素数が4(つまり、len(set(S)) == 4
)であればH,2B,3B,HRが揃っていると判断できます。(例えば仮に、S
が[2B,2B,3B,HR]
であれば set(S)
は{2B,3B,HR}
となりlen(set(S)) == 3
ですし、Sが[H,H,H,H]
であればset(S)
は{H}
となりlen(set(S)) == 1
となります)
(2) 出力
三項演算子を用いることで、set(S)
の要素数が4の場合はYes
、そうでない場合はNo
を出力するコードを1行にまとめて書くことができます。
S = [input() for _ in range(4)] #以下が新規追加分 print("Yes" if len(set(S)) == 4 else "No")
以上で、解答例が完成しました!
3. まとめ
今回はABC211 B問題の別解を解説しました。考え方を変え、コードを変えることでたった2行で済ますことができました。絶対に必要な標準入力を除けば1行で、この問題のコードを書くことができたわけです。このように複数パターンのコードを考えるのは良い勉強になりますし、最初に書いたコードよりも短く書けるとテンションが上がりますね!
次回はまた新しい問題に取り組んでいきますので、お楽しみに!