こんにちは!(^^)!
今回も、AtCoder Beginners Selectionの解説をしていきたいと思います。
今回は8問目の、Kagami Mochiを解いていきます!
Kagami Mochi
【問題文】
X段重ねの鏡餅(X≧1)とは、X枚の円形の持ちを盾に積み重ねたものであって、どのもちもその真下の餅より直径が小さい(一番下の餅を除く)もののことです。例えば、直径10、8、6センチメートルの餅をこの順に下から積み重ねると3段重ねの鏡餅になり、餅を一枚だけ置くと1段重ねの鏡餅になります。
ダックスフンドのルンルンはN枚の円形の餅を持っていて、そのうちi枚目の餅の直径はd¡センチメートルです。これらの餅のうち一部または全部を使って鏡餅を作るとき、最大で何段重ねの鏡餅を作ることができるでしょうか。
【制約】
・1≦N≦100
・1≦d¡≦100
・入力値はすべて整数である。
【入力】
入力は以下の形式で標準入力から与えられる。
N
d₁
:
dn
【出力】
作ることのできる鏡餅の最大の段数を出力せよ。
【入力例】
4
10
8
8
6
【出力例】
3
直径10、8、6センチメートルの餅をこの順に下から積み重ねると3段重ねの鏡餅になり、これが最大です。
【解答例】
N=int(input())
A=[int(input()) for i in range(N)]
B=set(A)
print(len(B))
それでは見ていきましょう。
一行目ではinput()によってキーボードから得た入力をint()で整数型に変換し、Nに代入していますね。
その次は、餅の直径を一つずつ得る必要があるのですが、縦に一つずつの入力となっているため、少し工夫が必要です。ここでは、リスト内包表記を使って値をキーボードの入力から一つずつ取り出し、int()によって整数型にするという処理をしています。リスト内包表記については、AtCoderに挑戦しよう③で詳しく解説していますので、ぜひご覧下さい!
そして、餅の直径の値をすべて格納したリストAをセットBに変換しています。
セットには同じ値を格納することはできないので、重複する値がリストAにある場合はセットに変換した時点で重複する値が除かれることになります。
今回の問題では、「異なる値が何個あるか」を求めればそれが答えとなるので、セットBの要素の個数をlen()で求め、プリントすれば良いということになります。
終わりに
いかがでしたか。
今回はいつもより短いコードで課題を達成することができましたね。
同じ課題を達成するときも、できるだけ処理が短いプログラムをかけたほうが効率も良いですね。
ではまた次の問題で(^^)/