https://www.acmicpc.net/problem/1043
이 문제는 집합(set())을 이용하여 문제를 풀면 된다.
집합에서 다음의 메소드를 알아두자.
- add(): 집합에 원소 추가
- update(): 집합에 원소 여러개 추가
- set.union(a,b): a와 b집합의 합집합
=a|b- set.intersection(a,b): a와 b집합의 교집합
=a&b- set.difference(a,b): a와 b집합의 차집합
=a-b
import sys
input = sys.stdin.readline
n, m =map(int,input().split()) #사람 수, 파티 수
know=set(input().split()[1:])
pnum=[]
cnt = 0
#파티 참가 정보 등록
for i in range(m):
pnum.append(set(input().split()[1:]))
#진실을 아는 사람 정보 등록
for i in range(m):
for party in pnum:
if party &know: #진실을 아는 사람이 겹치면 know에 추가(교집합)
know.update(party) #집합에 여러개를 추가할때는 update함수 사용!
for i in range(m):
for t in pnum[i]:
if t in know: #진실을 아는 사람이 있을 경우 cnt+=1
cnt+=1
break
print(m-cnt) #전체에서 진실만을 말해야하는 경우를 뺀다.