AtCoder Beginner Contest 208 A問題 Python解説

ABC208 A-Rolling Dice

問題はこちら

Pythonでの解法】

まず解答例を下に示します。

解答例

A,B = map(int,input().split())

if A <= B and A * 6 >= B:
  print("Yes")
else:
  print("No")

1. 問題文の把握

6面あるサイコロ(一般的なサイコロですね)をA回(このAは2かもしれないし、10かもしれないし100かもしれない。問題文の制約に「1≤A≤100」「Aは整数である」とあるので、この範囲内のどの整数が入っても成立するようなコードを書く必要があります)振った時に出た目の値の合計がB(A同様に問題文の制約から「1≤B≤1000」の範囲内の整数)になることがあるか否かを判定します。

2. コードを考える

(0) 標準入力

半角スペースで区切られた整数を変数AとBに代入します。map()を使うことでintinput().split()を同時に行うことができます。

A,B = map(int,input().split())

(1) 根幹

入力例1の補足は理解しやすいと思います。
では、入力例2はなぜ"No"と出力されるかを考えます。サイコロを2回振ったとき、出た目の値の合計値は最大でいくつになるでしょうか?
答えは2回×6(サイコロの目の最大値)で12ですね。そのため、13になることはあり得ません。
同様に考えると、入力例3はまさにサイコロの目の最大値である6が100回出た時の目の値の合計値になるので、出力は"Yes"となります。
以上のことから考えられるのは
A(サイコロを振る回数)× 6(サイコロの目の最大値)がB以上でなければならないということです。
よって、次のようなコードが考えられます。

A,B = map(int,input().split())
#以下が新規追加分
if A * 6 >= B:
    print("Yes")
else:
  print("No")

(2) 追加

しかし、上記のコードだけでは不十分です。 ここで、例えばAが3、Bが1の場合を考えてみましょう。 この場合、サイコロを3回振るわけですから合計値は最低でも3となります。この場合、本来は"No" が出力されるべきですが、if文の条件式がA * 6 >= Bだけでは"Yes"と出力されてしまいます。
そこで、A <= Bという条件を追加します。(例えば、A、Bともに3であった場合、3回とも1の目が出ればその合計値は3となり成立するので、=も含みます)
よって、次のようなコードとなります。

A,B = map(int,input().split())
#条件式にA <= B and を追加
if A <= B and A * 6 >= B:
  print("Yes")
else:
  print("No")

これで解答例のコードが完成しました!

3. まとめ

いかがでしたでしょうか?Pythonの文法としては、標準入力の他、if文だけで書ける問題でした。本問は、コードの書き方よりも題意の把握とそれをif文の条件式に反映させることが初心者の方にとってはポイントだったと思います。 ぜひ、この解説を参考にしてみて下さい。