본문 바로가기

Problem Solving/Baekjoon

[백준 1043 C++] 거짓말

오늘은 백준(BOJ) 1043번 거짓말 문제에 대해 다뤄볼 예정이다.

미확인 도착지 문제 링크 (백준(BOJ) 1043번 문제): https://www.acmicpc.net/problem/1043

 

1043번: 거짓말

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

www.acmicpc.net

문제 설명 

백준 1043번 거짓말 문제는 지민이가 각 파티에서 자신의 이야기의 진실을 알고 있는 사람이 있을 경우, 이야기를 과장되게 할 수 없으므로 이야기의 진실을 모르고 있는 사람들만 모인 파티의 최대 개수를 세는 문제이다. 즉, 다시 말해 파티 1에 [사람 1 (진실 앎), 사람 2, 사람 3] 이와 같이 파티를 열게 되면 사람 2, 사람 3도 진실을 알게 되기에 이야기를 과장할 수 없게 되어, 사람 2, 사람 3이 속한 파티에서 이야기를 과장할 수 없게 된다. 

문제 풀이

백준 1043번 거짓말 문제는 각 집합을 나눠야하는 작업을 해주어야 하기 때문에 UnionFind 알고리즘으로 풀 수 있으며, 시간이 2초로 잡혀있어 DFS 알고리즘으로도 풀 수 있다. 하지만, 쓴이는 UnionFind 알고리즘으로 문제를 해결하였다. 

 

처음 문제를 풀고 난 후, 예제 케이스는 다 통과 했었지만 반례(Conuter Example)로 아래와 같은 입력의 결과가 2가 나왔었다. 

Counter Example:
4 5
1 1
1 1
1 2
1 3
2 4 2
2 4 1
Result: 1

처음 위 예제를 입력 하였을 때, ID 배열이 1 2 3 1 이와 같이 나와서 답이 2가 나왔던 것이다. 

이 문제의 핵심은 그룹을 비교할 때, 루트 노드 간에 비교를 해주어야 하는 것이었다. 

 

위 내용에 대한 소스코드는 아래와 같고, 86번 째 줄이 핵심이라고 볼 수 있다. 

'Problem Solving > Baekjoon' 카테고리의 다른 글

[백준 1238 C++] 파티  (0) 2021.12.28
[백준 1149 C++] RGB 거리  (0) 2021.12.28
[백준 16234 C++] 인구 이동  (0) 2021.10.03
[백준 11438 C++] LCA 2  (0) 2021.10.01
[백준 13334 C++] 철로  (0) 2021.09.28