競技プログラミング

【超初心者向け】AtCoderで最初に解くべき過去問集を分かりやすく解説します【5問目】

プログラミング

こんにちは!サトシ(@satoshi365_blog)です!

 

この記事では、「AtCoderに登録して最初に解くべき10問(AtCoder Beginners Selection)」の5問目「Some Sums」をめちゃくちゃ分かりやすく解説していきます。

AtCoder で問題を解くためには、新規登録しないといけません。

新規登録はこちらから → AtCoder に新規登録する

 

それでは、「Some Sums」の解説をしていきます!

プログラミング
【競プロ】最初に解くべき過去問10問をPythonで分かりやすく解説します!【AtCoder】こんにちは!サトシ(@satoshi365_blog)です! この記事では、「競技プログラミング(AtCoder)に登録し...

5問目「Some Sums」で身につくスキル

この問題では、こんなスキルが身につきます。

身につくスキル
  • sum() の使い方
  • str() の使い方
  • for を文字列で繰り返す

先に、これがどのようなスキルなのかを説明します。

 

sum() の使い方

sum() を使うと、リスト中の数字の合計を計算できます

例えば、このように書くと、リスト [1, 2, 3, 4] の合計を計算できます。

print(sum([1, 2, 3, 4))   # 10 と出力

 

str() の使い方

str() を使うと、数値を文字列に変えることができます

例えば、このように書くと、数値 123 を文字列  ‘123’ に変えることができます。

print(str(123))   #'123' と出力

 

for を文字列で繰り返す

for はリストや range() だけじゃなくて、文字列にも使えます

例えば、このように書くと、「’H’」、「’e’」、「’l’」、「’l’」、「’o’」と出力できます。

for i in 'Hello':
  print(i)

# 'H' と出力
# 'e' と出力
# 'l' と出力
# 'l' と出力
# 'o' と出力

 

5問目「Some Sums」の解説

この順番で解説していきます。

  • 問題文
  • 入力例と出力例
  • 解答例
  • 解説

それでは見ていきましょう。

 

問題文

 

問題文
1 以上 N以下の整数のうち、10 進法での各桁の和が A 以上 B 以下であるものの総和を求めてください。

制約
・1 ≤ N ≤ 104
・1 ≤ A ≤ B ≤ 36
・入力はすべて整数である

入力
入力は以下の形式で標準入力から与えられる。

N A B

出力
1 以上 N 以下の整数のうち、10 進法での各桁の和が A 以上 B 以下であるものの総和を出力せよ。

ABC083B – Some Sumsより引用

 

入力例と出力例

入力例

13 3 6

出力例

43

1以上13以下の整数のうち、各桁の和が3以上6以下のものは「3、4、5、6、12、13」です。

なので、これらの合計である「43」を出力します。

 

解答例

n, a, b = map(int, input().split())
ans = 0
for i in range(n + 1):
  if a <= sum([int(x) for x in str(i)]) <= b:
    ans += i
print(ans)

解説

N=13、A=3、B=6だったとします。この場合、このように計算していきます。

  1. 「0」の各桁の和が3以上6以下だったら、ans に各桁の和を足す
  2. 「1」の各桁の和が3以上6以下だったら、ans に各桁の和を足す
  3. 「2」の各桁の和が3以上6以下だったら、ans に各桁の和を足す
  4. 「13」の各桁の和が3以上6以下だったら、ans に各桁の和を足す

 

では、コードを詳しく解説していきます。

 

まずは、n, a, b を受け取ります。

n, a, b = map(int, input().split())

 

整数の総和を求めるために、ans を作っておきます。

ans = 0

 

N 以下の整数の各桁を見ていくために、for を動かします。

for i in range(n + 1):

 

もし、各桁の和が A 以上 B 以下だったら、ans にその整数を足します。

  if a <= sum([int(x) for x in str(i)]) <= b:
    ans += i

※[int(x) for x in str(’13’)] を動かすと、[1, 3] というリストができます

 

N 以下の整数を全部見終わったら、総和 ans を出力します。

print(ans)

 

 

まとめとして、もう一度プログラムを確認してみましょう。

n, a, b = map(int, input().split())
ans = 0
for i in range(n + 1):
  if a <= sum([int(x) for x in str(i)]) <= b:
    ans += i
print(ans)

これで「1 以上 N 以下の整数のうち、各桁の和が A 以上 B 以下であるものの総和」を求めることができました。

まとめ

もし分からない点などありましたら、気軽にTwitterなどでご質問ください^^

少しでも参考になれば嬉しいです!

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です