🎉

【AtCoder解説】ABC087B - Digits Sum を解いた記録

に公開

本記事は、AtCoder の問題を解いて得た知見を記録するための学習ログです。
毎回1問ずつ、「何を考えて解いたか」「どう実装したか」「学んだこと」を簡単にまとめていきます。

問題概要

500円玉、100円玉、50円玉からそれぞれ与えられた数から任意枚選び合計金額をちょうどX円にする方法が何通りあるか数える問題

解放とコード

a = int(input())
b = int(input())
c = int(input())
x = int(input())
sum = 0
count = 0
for i in range(a + 1):
  for j in range(b + 1):
    for k in range(c + 1):
      sum = 500 * i + 100 * j + 50 * k
      if(sum == x):
        count += 1
        sum = 0
      else:
        sum = 0
print(count)

3重ループにして解いた

解きながら考えたこと・学んだこと・感じたこと

  • 時間がかかった
  • 煩雑なコードだなと書きながら思った。
  • range()が、イテレータが引数まで増えるのか、引数回繰り返すのかわからなくなった。実際は後者。
  • やっぱり数学的解法が大事。

AIの評価

  • sumはpythonの組み込み関数であるので使うべきでない
  • sumは毎回更新しているので、sum = 0の初期化は最初以外はいらないし、else文移行もいらない

綺麗な回答

a = int(input())
b = int(input())
c = int(input())
x = int(input())

count = 0
for i in range(a + 1):
  for j in range(b + 1):
    for k in range(c + 1):
      total = 500 * i + 100 * j + 50 * k
      if total == x:
        count += 1

print(count)

全検索がセオリーのよう。

Discussion