[BOJ] Q1043 거짓말
[BOJ] Q1043 거짓말
Question
Language: Python
Difficulty: Gold 4
해당 문제는 set을 활용하여 간단하게 풀이하는 것이 가능하다. 진실을 아는 사람의 집합이 있을때, 각 파티에 대해서, party 갯수 만큼 반복 수행하는 과정에서 진실을 아는 사람과 겹치는 party가 있는 경우, 해당 party 내에 있는 사람들은 모두 진실을 아는 사람에 포함시키는 방식으로 진행하여 최종적으로 party에 진실을 아는 사람이 없는 경우를 더해주면 된다.
Solution 1
import sys
def solution():
global trues
for _ in range(m):
for party in parties:
if party & trues:
trues=trues.union(party)
count=0
for party in parties:
if party & trues:
continue
count+=1
print(count)
if __name__ == '__main__':
n,m=map(int,input().split())
trues=set(map(int,input().split()[1:]))
parties=[set(map(int,input().split()[1:])) for _ in range(m)]
solution()
Solution 2
party 갯수만큼 반복하는 방법도 있지만, 서로 같은 파티에 연결된 경우 간선을 묶어주고 bfs을 통해 진실 아는 사람을 모두 구해서 각 파티에 대한 검증을 수행하는 방향을 고려할 수도 있다. 또한, 해당 파티에 진실을 아는 사람이 속해있는 판단하는 과정에서 bit-masking을 활용할 수도 있다.
import sys
from collections import deque
def bfs(start_vertex):
global true_bit
queue=deque([(start_vertex)])
while queue:
vertex=queue.popleft()
for adj_vertex in graph[vertex]:
adj_vertex_bit=1 << adj_vertex
if true_bit & adj_vertex_bit == adj_vertex_bit:
continue
true_bit |= adj_vertex_bit
queue.append(adj_vertex)
def solution():
global true_bit
for true_person in trues:
true_person_bit=1 << true_person
if true_bit & true_person_bit == true_person_bit:
continue
true_bit |= true_person_bit
bfs(true_person)
count=0
for party_bit in parties:
if party_bit & true_bit == party_bit:
continue
count+=1
print(count)
if __name__ == '__main__':
n,m=map(int,input().split())
trues=list(map(int,input().split()[1:]))
true_bit=0
parties=[]
graph=[set() for _ in range(n+1)]
for _ in range(m):
party=list(map(int,input().split()))
length=party[0]
src=party[1]
party_bit = 1 << src
for i in range(2,length+1):
dest=party[i]
party_bit |= 1 << dest
graph[src].add(dest)
graph[dest].add(src)
parties.append(party_bit)
solution()
댓글남기기