ABC 211 B問題 (別解)Python解説

この記事では前回も扱った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行で、この問題のコードを書くことができたわけです。このように複数パターンのコードを考えるのは良い勉強になりますし、最初に書いたコードよりも短く書けるとテンションが上がりますね!
次回はまた新しい問題に取り組んでいきますので、お楽しみに!