AtCoder版!蟻本】ABC091 B - Two Colors Card Game【set,map】
AtCoder版!蟻本のset,mapの例題としてあげられているABC091 B - Two Colors Card GameをPythonで解いていきます。
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