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

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

エイシングプログラミングコンテスト2021 C - Made Up【Python解答例】

f:id:ebisuke33:20210522225640p:plain

エイシンプログラミングコンテスト2021(AtCoder Beginner Contest202)のC問題についてPythonの解答例を記事にしていきます。
AISing Programming Contest 2021(AtCoder Beginner Contest 202) - AtCoder


AtCoder Beginner Contest202 C - Made Up

C - Made Up

問題文

1 以上 N 以下の整数からなる長さ N の数列 A=(A1,A2,…,AN),B=(B1,B2,…,BN),C=(C1,C2,…,CN) が与えられます。
1 以上 N 以下の整数 i , j の組 ( i , j ) であって、Ai=BCj となるものの総数を求めてください。

制約

・1≤N≤10^5
・1≤Ai,Bi,Ci≤N
・入力は全て整数である。

解答例

import collections

n = int(input())

A = list(map(int, input().split()))
B = list(map(int, input().split()))
C = list(map(int, input().split()))

Bcj = []
for j in range(n):
    tmp = B[C[j] - 1]
    Bcj.append(tmp)

a = collections.Counter(A)

ans = 0
for i in range(len(BCj)):
    ans += a[BCj[i]]

print(ans)

解説

長さNの3つの数列があり、Ai = Bcjとなる( i , j )の数を求める問題です。

Bcj配列にBcjの値を格納していきます。

次にAiの各 値の出現回数をcollections.Counterを用いてaにまとめておきます。

後はBcjの値毎にaを参照して出現回数を調べて、ans変数に足しあわせました。

ループを抜けたあとのans変数には求める値が代入されていますので出力すればOKでした。



ABC202の関連記事はこちら
ebisuke33.hatenablog.com