# Coding/# 백준

[백준 / 1043] 거짓말 - Python

강현들 2022. 2. 10. 13:56
728x90
반응형

https://www.acmicpc.net/problem/1043

 

1043번: 거짓말

지민이는 파티에 가서 이야기 하는 것을 좋아한다. 파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게

www.acmicpc.net

 

<풀이>

파티 순서는 상관이 없다. 왜냐하면 거짓과 진실을 둘다 들을 수 없기 때문이다. 따라서 전염병 같이 진실을 알고 있는 사람과 만난사람, 그 만난 사람과 만난 사람들 모두 체크해서 해당 사람들이 들어간 파티를 제외하면 거짓말을 할 수 있는 파티가 된다.

 

따라서 n번 사람이 접촉하는 사람을 딕셔너리 형태로 만든 후, n번이 접촉한 사람 리스트를 queue에 넣어 이를 반복해서 접촉 리스트를 만든다.

 

from collections import deque

N, M = map(int, input().split())

truth = list(map(int, input().split()))
truthPeople = truth[1:]

meets = {}
parties = []

for _ in range(M):
    party = list(map(int, input().split()))
    for i in range(party[0]):
        idx = i+1
        now = party[idx]
        if now not in meets:
            meets[now] = party[1:idx]+party[idx+1:]
        else:
            meets[now].extend(party[1:idx]+party[idx+1:])
    parties.append(party)

answer = 0

for i in meets:
    meets[i] = set(meets[i])

queue = deque(truthPeople)
while queue:
    truthPerson = queue.pop()
    if truthPerson in meets:
        gap = list(meets[truthPerson]-set(truthPeople))
        truthPeople.extend(gap)
        queue.extend(gap)

for party in parties:
    if len(set(truthPeople) & set(party[1:])) == 0:
        answer += 1

print(answer)
728x90
반응형