728x90
https://www.acmicpc.net/problem/1043
문제
지민이는 파티에 가서 이야기 하는 것을 좋아한다. 파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게 과장해서 말한다. 당연히 과장해서 이야기하는 것이 훨씬 더 재미있기 때문에, 되도록이면 과장해서 이야기하려고 한다. 하지만, 지민이는 거짓말쟁이로 알려지기는 싫어한다. 문제는 몇몇 사람들은 그 이야기의 진실을 안다는 것이다. 따라서 이런 사람들이 파티에 왔을 때는, 지민이는 진실을 이야기할 수 밖에 없다. 당연히, 어떤 사람이 어떤 파티에서는 진실을 듣고, 또다른 파티에서는 과장된 이야기를 들었을 때도 지민이는 거짓말쟁이로 알려지게 된다. 지민이는 이런 일을 모두 피해야 한다.
사람의 수 N이 주어진다. 그리고 그 이야기의 진실을 아는 사람이 주어진다. 그리고 각 파티에 오는 사람들의 번호가 주어진다. 지민이는 모든 파티에 참가해야 한다. 이때, 지민이가 거짓말쟁이로 알려지지 않으면서, 과장된 이야기를 할 수 있는 파티 개수의 최댓값을 구하는 프로그램을 작성하시오.
코드
- Node class를 사용한 disjoint set(분리 집합) 적용
- root를 항상 진실을 아는 사람이 되도록 지정
- 다른 풀이에서는 Node class를 사용하는 대신 global list를 사용
class Node:
def __init__(self, x: int) -> None:
self.data = x
self.parent = self
def union_set(x, y):
x, y = find_set(x), find_set(y)
if x == y:
return
# 아는 사람을 항상 root로 지정
if y.parent.data in known_people:
x.parent = y
else:
y.parent = x
def find_set(node):
if node.parent != node:
node.parent = find_set(node.parent)
return node.parent
N, M = map(int, input().split()) # 사람 수, 파티 수
people = [Node(i) for i in range(N + 1)] # 전체 사람
known_people = list(map(int , input().split()))[1:]
if len(known_people) == 0:
print(M)
else:
# union set
parties = []
for _ in range(M):
party_people = list(map(int, input().split()))[1:]
for i in range(len(party_people) - 1):
union_set(people[party_people[i]], people[party_people[i + 1]])
parties.append(party_people)
answer = M
known_people = [people[p] for p in known_people]
for party in parties:
for person in party:
if find_set(people[person]) in known_people:
answer -= 1
break
print(answer)
[reference]
https://github.com/TheAlgorithms/Python/blob/master/data_structures/disjoint_set/disjoint_set.py
728x90
'Algorithm & Data Structure > Baekjoon' 카테고리의 다른 글
[Baekjoon/python] 특정한 최단 경로 #1504 (0) | 2023.06.06 |
---|---|
[Baekjoon/python] 파티 #1238 (0) | 2023.06.05 |
[Baekjoon/python] 트리의 지름 #1167 (0) | 2023.06.04 |
[Baekjoon/python] four squares #17626 (0) | 2023.06.01 |
[baekjoon/python] 아기 상어 #16236 (1) | 2023.05.30 |