ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

AtCoder版!蟻本】ABC091 B - Two Colors Card Game【set,map】

f:id:ebisuke33:20210621223940p:plain

AtCoder版!蟻本のset,mapの例題としてあげられているABC091 B - Two Colors Card GameをPythonで解いていきます。

B - Two Colors Card Game

ABC091 B - Two Colors Card Game

問題文

高橋君は青いカードを N 枚,赤いカードを M 枚持っています。 カードにはそれぞれ文字列が書かれており, i 枚目の青いカードに書かれている文字列は si, i 枚目の赤いカードに書かれている文字列は ti です。

高橋君は,文字列を 1 つ言います。 そして,全てのカードを確認し, その文字列が書かれた青いカードを 1 枚見つけるごとに 1 円貰えます。 また,その文字列が書かれた赤いカードを 1 枚見つけるごとに 1 円失います。

なお,高橋君の言った文字列と,カードに書かれた文字列が完全に一致していた場合のみを考えます。 例えば,高橋君が atcoder と言った場合,atcoderr,atcode,btcoder などと書かれた青いカードがあってもお金は貰えません(逆に,このような文字列が書かれた赤いカードがあってもお金を失うことはありません)。

高橋君は,最大で差し引き何円貰うことができるでしょうか?

ただし,違うカードに同じ文字列が書かれていることもあることに注意してください。

制約

・N,M は整数
・1≤N,M≤100
・s1,s2,...,sN,t1,t2,...,tM は全て長さ 1 以上 10 以下の文字列で,英小文字のみからなる

解答例

n = int(input())

S = []
for i in range(n):
    s = input()
    S.append(s)

m = int(input())

T = []
for i in range(m):
    t = input()
    T.append(t)

Dict = {}

for i in range(n):
    Dict.setdefault(S[i], 0)

for j in range(m):
    Dict.setdefault(T[j], 0)

for i in range(n):
    Dict[S[i]] += 1

for j in range(m):
    Dict[T[j]] -= 1

ans = 0
for k in Dict.values():
    ans = max(ans, k)

print(ans)

解説

ある文字列が青いカードに書かれていれば1円もらえて、赤いカードに書かれていれば1円失います。
適切な文字列を選んだとき、最大で何円もらうことができるか答える問題です。

C++ならmapを使うと便利みたいですが、Pythonでは無さそうでしたので、それらしく辞書を使ってコードを書いてみました。

まず、青いカードと赤いカードに出てくる文字列を、辞書にキーとして追加していきました。

つぎに青いカードに書かれている文字列には+1、赤いカードに書かれている文字列に-1ずつ辞書のvalueを変更していきます。

最後にループで各キーの値を調べて、最大値をans変数に代入していきました。

ループを抜けてansを出力すればACでした!



AtCoder版!蟻本(初級編)の記事リンクページはこちら
ebisuke33.hatenablog.com