Pythonメモ1-2

引き続き、AtCoder Beginners Selectionをやります。

atcoder.jp

 

 

 

ABC083B - Some Sums

サムサム問題。さむいのかな?(寒)

 

・パッと見、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関数で各桁の和として数え上げることが可能だ。要は以下の通り。

 

  1. for i in range(1, n+1):
  2.   sum(map(list(map(int,str(i)))))

 

 

・さて、ここまでくれば何をすればいいかはあとは分かるだろう。ということでコードを書く。

 

 

  1. n,a,b = map(int,input().split())
  2. c = 0
  3. for i in range(1, n+1):
  4.   if a<= sum(list(map(int, str(i)))) <=b:
  5.     c = c + i
  6. print(c)

 

 

感想:なんか書くのに疲れる。考えるのも疲れる。もうなんにも書きたくない。

   なぜ各桁の和が上記のように書けるのかを助言して頂いたアト・マーケ氏には多大なるで頭が上がりません。ありがとうございます。

 

結論:うんち!w

 

 

 

ABC088B - Card Game for Two

気が向いたらまた書く。脳が追い付かない。

listとsortを上手く組み合わせる。また、list[i]がlistのi+1番目の要素を表すことも押さえておこうね。

 

 

 

 

ABC085B - Kagami Mochi

 

鏡餅問題。

・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型を使ってみることにする。

例えば、コードを次のように書き、出力してみると・・・

 

  1. a = set([1,2,3])
  2. 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)) と変えたらどうだろう?

 

  1. 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メソッドを使えばいい。

具体的なコードを示す方が個人的にも理解がしやすいのでコードを流してみる。

 

  1. a = set([1,2,3])
    a.odd(4)
    print(a)  ⇒  [1,2,3,4]

 

X.odd(Y) にすればよさそうだ。
ということで、以上の流れをまとめて、コードをプログラムしていく。

また、断り書きとして次のことも一気にまとめて書いておく。

 

▼標準入力で縦に並んだ n 個の要素 d を考える際はfor文で要素を書き出す。

  1. for i in range(n):
      d = int(input())

 

▼初期時のset型の D には何一つ要素がないので [] はいらない。

  1. D = set()

 

以上のふたつを考慮して、今までの流れをおさらいしよう。

 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

ここまでの流れ:n 個の要素 d をset型 D に D.odd(d) で追加し、print(len(D)) で D の要素数を出力する。

 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

・もーここまで書いたら流石に書けますね。書くことなし!w

 

 

  1. n = int(input())
  2. D = set()
  3.  
  4. for i in range(n):
  5.   d = int(input())
  6.   D.add(d)
  7. 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

↑ほかにもこんなのがあるよ的なおまけ