Help us understand the problem. What is going on with this article?

Pythonで要素数カウントする方法(辞書型)

はじめに

今回の主なテーマは要素数をカウントしたいときに辞書型でカウントして格納する方法を書いていきたいと思います。自分がよく使うので復習の意味を込めています笑

AtCoder Beginner Contest 163のC問題でも活用できたので、おまけとして問題も解説していきます。

AtCoder Beginner Contest 163

C - management

まずは本題の問題からみていきましょう。
要素数をカウントする問題だけみたい方はここだけ読んでください。

スクリーンショット 2020-04-20 0.07.31.png

問題の題意は数字が与えられてその数字が何回出現するかをカウントしたいということです。このときにcollectionsライブラリ内の関数で得ることもできると思いますが、処理も単純なので書いてしまいましょう。

ここでjosi_mapが辞書型の配列でid_list内の数字をカウントしたいというのが目的です。
まず1番目のforループで辞書のkeyを出現する数字に対して0をvalue値として初期化します。次に2番目のforループで要素数をカウントします。出現したkeyのvalueを+1しています。

ここまでで要素のカウントは終わりですが、最後のforループは出力のために回しています。この処理は5回くらいは書いたことあるので覚えておいて損ではないと思います笑

people=int(input())
id_list=list(map(int,input().split()))
josi_map={}
for i in range(people):
    josi_map[i+1]=0

for i in id_list:
    josi_map[i]+=1

for i in range(people):
    print(josi_map[i+1])

その他の問題に関しても書いていきます。

A - Circle Pond

スクリーンショット 2020-04-19 23.25.03.png

import math
r=int(input())
print(2*math.pi*r)

円周は半径をRとしたときに2${\pi}$Rで求められます。
円周率を使うにはmathライブラリを用います。
数値計算の関数が多数あるライブラリですが、値として円周率も格納されています。
その値はpiに格納してあるので、math.piを変数でうけて用います。

出力に関して想定回答との絶対誤差または相対誤差が${10^{-2}}$以下であれば良いと記述があるのですが以下にそれぞれの誤差を記述します。

絶対誤差:出力-想定回答
相対誤差:(出力-想定回答)÷想定回答

想定回答が小数点以下20桁まで計算しており、出力は小数点以下15桁まで計算しており、問題ないと判断できます。誤差が効いてくるとすれば、入力が${10^{12}}$程度にならないと問題にならないので提出します。

B - Homework

スクリーンショット 2020-04-19 23.58.29.png

問題の題意は夏休みの日数と宿題にかかる日数が入力で与えられて、夏休みの日数が多ければ残りの日数を、そうでなければ-1を出力せよということです。
境界値だけ気をつけましよう。残り日数が0日の場合を-1ではなく0と出力します。

day,work_num=map(int,input().split())
works=list(map(int,input().split()))
if day>=sum(works):
    print(day-sum(works))
else:
    print(-1)

別解として出力を
max(day-sum(works),-1)とたほうが記述量が減りますね。

D - Sum of Large Numbers

スクリーンショット 2020-04-20 0.22.21.png

この問題の題意はN+1個の自然数からK個以上のの整数を選ぶときに合計値の取り得る数を求めよということです。Kが2のときなどで実験してみるとわかるのですが選び方によっては合計値が重複してしまうことがわかります。

ですが規則性も見えてきます。K個選ぶ時に最小の合計値から最大の合計値まで1ずつ刻みで全ての数字が取り得ることがわかります。あとはforをKからN+2まで回して足し合わせていけば求まります。その合計値の取り得る数をforの中のsum_numで計算しています。

最後に出力はmod(${10^{9}}$+7)で指定されているので%演算子で出力しました。
規則を見つけるまではノートに書いていきました。重複はしても各Kに対して合計値の取り方はNに依存するが数式で表せると判断できたのでコードに落としました。

people=int(input())
n,k=map(int,input().split())
sum_num=0
for i in range(k,n+2):
    sum_num+=(i*n-i*(i-1)+1)

print(sum_num%(10**9+7))

終わりに

ご覧いただきましてありがとうございました。
要素数カウントする方法を主に紹介したかったのですが、内容が少なかったので他の問題も掲載しました。

追記として、競プロで変数を1文字にするか悩みますが、処理が少しでも複雑ならわかりやすい変数名をつけた方が効率が良いように感じています。今回はここまでとします。

Ryosci
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした