こんにちは!(^^)!
今回も、AtCoder Beginners Selectionやっていきます!
今回は、6問目であるSome Sumsの解説をしていきたいと思います。
Some Sums
【問題文】
1以上N以下の整数のうち、10進法での各桁の和がA以上B以下であるものの総和を求めてください。
【制約】
・1≦N≦10⁴
・1≦A≦B≦36
・入力はすべて整数である
【入力】
入力は以下の形式で標準入力から与えられる。
N A B
【出力】
1以上N以下の整数のうち、10進法での各桁の和がA以上B以下であるもののそうっを出力せよ。
【入力例】
20 2 5
【出力例】
84
20以下の整数のうち、各桁の和が2以上5以下なのは2,3,4,5,11,12,13,14,20です。これらの合計である84を出力します。
【解答例】
N,A,B=map(int,input().split())
total=0
for i in range(N+1):
if A <= sum(list(map(int,list(str(i))))) <= B:
total+=i
print(total)
ちょっと()が多いですね。。。
それでは解説していきます!
一行目では、map()とint()を使ってキーボードからの入力を整数型にしてそれぞれN,A,Bに代入しています。map()の使い方についてはAtCoderに挑戦しよう①で詳しく解説しています!非常によく出てくる方法なので、もし分からない人はこちらを参照してください!
二行目では、今回の問題の答えの出力となるtotalに0を代入しています。
三行目から始まるforの文では、0からNに代入された値までを1つずつ取り出してその後のif文に繋げています。
このif文では、「取り出されたiの値を文字列に変換し、リストに格納して、そのリストから要素を1つずつ整数型に変換して取り出したものをリストに格納し、そのリストの合計を求め、その値がAとBの間にあるかどうか」という条件分岐を行っています。
・・・・・・
少しややこしいですね。
リストに文字列を格納するとき、一文字ずつの要素として格納される、ということがわかれば、理解しやすいのではないかと思います。以下に例を示します。
>>> A="123456789"
>>> B=list(A)
>>> print(B)
['1', '2', '3', '4', '5', '6', '7', '8', '9']
このように、Bというリストに格納した文字列は1文字ずつの要素として格納されていることがわかると思います。
今回の問題では、「各桁の和を計算する」という課題を、「値を文字列にしてリストに格納し、バラバラにしてから合計を計算する」という方法で解決しているというわけです。
このようにして各桁の数を求めたら、それがA以上B以下であるかどうかで条件分岐をします。それがTrueであれば、totalにiの値を足していくというわけです。
この操作がiが0からNの間まで繰り返されるため、その間にtotalに足された値の合計が、答えとなります。よって、最後にprint()でtotalを出力しています。
終わりに
いかがでしたか。一見難しそうに見える問題も、解き方次第で案外簡単に解けてしまうと思ったのではないでしょうか。どの様に課題を解けばよいか考えることは、プログラミングの醍醐味ですね。
ではまた、次の問題でお会いしましょう(^^)/
次の記事