Pythonメモ1-2
引き続き、AtCoder Beginners Selectionをやります。
サムサム問題。さむいのかな?(寒)
・パッと見、for文を 1~N まで繰り返し、その各々の N に対し、N の各桁の和 N' が A <= N' <= B を満たすような条件を立式すればよいのがわかる。
・よって、N の各桁の和 N' をどうにかして表す必要があるが、ここで偉大なるアト・マーケ先生から助言を頂いた。
>>実は文字列"abc"は["a","b","c"]とほぼ同一視されてる
>>だからmap(int,str(N))は
「Nの文字列(≒各桁ごとの文字のリスト)を各成分ごとにintを通した奴ら」
=各桁の数字1個1個の羅列
・なるほど、文字列101はstrで["1","0","1"]と同一視されており、これらの各々の文字に対しmap関数のintを通すことで全文字を数値化している。
・加えて、for文で複数個の要素を扱うので、listが有効だ。更に嬉しいことに、リスト内の要素をsum関数で各桁の和として数え上げることが可能だ。要は以下の通り。
- for i in range(1, n+1):
- sum(map(list(map(int,str(i)))))
・さて、ここまでくれば何をすればいいかはあとは分かるだろう。ということでコードを書く。
- n,a,b = map(int,input().split())
- c = 0
- for i in range(1, n+1):
- if a<= sum(list(map(int, str(i)))) <=b:
- c = c + i
- print(c)
感想:なんか書くのに疲れる。考えるのも疲れる。もうなんにも書きたくない。
なぜ各桁の和が上記のように書けるのかを助言して頂いたアト・マーケ氏には多大なるで頭が上がりません。ありがとうございます。
結論:うんち!w
気が向いたらまた書く。脳が追い付かない。
listとsortを上手く組み合わせる。また、list[i]がlistのi+1番目の要素を表すことも押さえておこうね。
鏡餅問題。
・n 個の要素が各々1~100までの整数値を取り、それらの要素を全て数える。
・ただし、条件として整数値が複数個ダブった場合、1カウント。(本問の問われる所)
・また、厄介なことに標準入力も初めて見る。
ちょっとした例:
整数値が 1 2 3 4 であれば 4 を出力。
整数値が 1 2 1 2 であれば 2 を出力。
整数値が 1 1 1 1 であれば 1 を出力。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
本問は集合を取り扱う型があると非常に便利で、尚且つ重複があると自動的に排除してくれるものがあると助かる。
探してみると・・・あるじゃないか!set型!
set型はlist型と非常に似ており、割りと扱いやすい複数の値を格納できる型である。
list型と異なる主な点は以下のふたつ。
1.重複した要素がない
2.要素に順番がない
さて、早速set型を使ってみることにする。
例えば、コードを次のように書き、出力してみると・・・
- a = set([1,2,3])
- b = set([3,2,2,1,3,2])
print(a) ⇒ {1,2,3}
print(b) ⇒ {1,2,3}
このように、a と b は一見別物であるが、set型の世界においては同じものとして扱える。
さて、ここで print(b) を print(len(b)) と変えたらどうだろう?
- b = set([3,2,2,1,3,2])
print(b) ⇒ {1,2,3}
print(len(b)) ⇒ 3
なるほど、どうやら本問の場合はN 個の要素を b に追加し、set型でダブりを排除し、print(len(b)) で出力すればよいことがわかる。
ここで、新たに次の問題が起きる。
どうやってset型オブジェクトに要素を追加するんだい!(NKYMKNNKN風)
実は非常に簡単。addメソッドを使えばいい。
具体的なコードを示す方が個人的にも理解がしやすいのでコードを流してみる。
- a = set([1,2,3])
a.odd(4)
print(a) ⇒ [1,2,3,4]
X.odd(Y) にすればよさそうだ。
ということで、以上の流れをまとめて、コードをプログラムしていく。
また、断り書きとして次のことも一気にまとめて書いておく。
▼標準入力で縦に並んだ n 個の要素 d を考える際はfor文で要素を書き出す。
- for i in range(n):
d = int(input())
▼初期時のset型の D には何一つ要素がないので [] はいらない。
- D = set()
以上のふたつを考慮して、今までの流れをおさらいしよう。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ここまでの流れ:n 個の要素 d をset型 D に D.odd(d) で追加し、print(len(D)) で D の要素数を出力する。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
・もーここまで書いたら流石に書けますね。書くことなし!w
- n = int(input())
- D = set()
- for i in range(n):
- d = int(input())
- D.add(d)
- print(len(D))
感想:set型についてちょこっと学べて面白かった。
他にも要素を消すremoveメソッド、全要素を消すclearメソッド、集合の演算(和集合、積集合、差集合、排他的理論和集合)、list型をset型にする方法(li = list[,,,] を se = set(li) にする)、などがあることを知り、知的好奇心を刺激させられた。
結論:ムズスギィ!
参考:
【Python入門】すぐわかる!set型(集合型)の基本まとめ | 侍エンジニアブログ
↑めっちゃ参考になった(初心者目線)
【AtCoder版!蟻本】ABC085 B - Kagami Mochi【set,map】 - ebisuke競プロ初心者脱出黙示録
↑答えを参考にさせて頂きました。ありがとうございます。
Python, set型で集合演算(和集合、積集合や部分集合の判定など) | note.nkmk.me
↑ほかにもこんなのがあるよ的なおまけ