ABCのC問題埋めをしながらPython練習1

投稿者: | 2020年6月5日

基本的にC++で書いていますが、ABC169のような問題が来たときにpythonが使えたら楽だなと思ったので、ABCのC問題埋めしながら、2問ぐらいpythonで実装してました。知らないことばかりなのでメモしていきます。

1.ABC073C

連続する要素をカウントするのに、groupbyがあります。また、要素の出現回数をまとめてカウントするものにcollections.Counterがあります。

C++で書くとちょっとめんどくさい出現回数のカウントが一発です。楽ちん。

2.ABC159D

pythonの自作関数は使う前ならどこでもいいっぽい。

あと、pythonは++や–が使えないので、+=1や-=1で書く必要があるようです。

3.ARC086D

pythonでどうやって実装するんだろうと思って提出を見ていたら、pythonらしく書いている提出があって、すげーってなりました。

from collections import Counter

N, K = map(int,input().split())
C = Counter(list(map(int,input().split())))

print(sum(sorted(list(C.values()), reverse=True)[K:]))

提出#13983505より

まず1で書いたcollections.Counterで整数の要素をリストに入れます。

そして、6行目がすごくpythonっぽいです。

print()

これは標準出力になります。

print(sum())

これで総和を出力できます。

print(sum(sorted()))

リストをソートしたものの総和を出力します。

print(sum(sorted(list(C.values()), reverse=True)))

リストCに格納されているvalueを降順にソートし、その総和を出力できます。

print(sum(sorted(list(C.values()), reverse=True)[K:]))

最後に[K:]が付いています。これはスライス操作です。今回、リストのK-1番目~リストの最後までの総和を求める必要があります。そのため、こういうことをしているようです。

スライス操作は

sequence[start:stop]

と書くので、今回は降順にソートしたリストをK-1番目から最後までスライスするという意味になります。

こういうのを息をするように書けるようになりたいものです。

4.参考文献

Pythonで競プロやるときによく書くコードをまとめてみた

Pythonでリストをソートするsortとsortedの違い

Pythonのdivmodeで割り算の商と余りを同時に取得

pythonではインクリメント・デクリメントに++や–は使えない

Pythonでリスト(配列)に要素を追加するappend,extend,insert

Pythonのリスト(配列)を任意の値・要素数で初期化

Pythonのdef文で関数を作る方法

【Python】スライス操作についてまとめ

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください