문제 링크
- http://icpc.me/2234
문제 출처
- 1994 IOI Day1 2번
사용 알고리즘
- BFS + bitmask
- UnionFind + bitmask
시간복잡도
- O(N4)
- O(N2 * a(N2))
풀이
BFS 사용
1번 문제와 2번 문제는 단순한 BFS 문제입니다.
다만, 인접한 칸으로 이동할 때 벽이 있는지 없는지 확인을 해야 합니다. 벽의 존재 여부는 bitmask를 사용하여 확인할 수 있습니다.
여기까지는 O(N2)입니다.
3번 문제를 보면, 하나의 벽을 제거하여 얻을 수 있는 가장 넓은 방의 크기를 구해야 합니다. 모든 벽들을 보면서 하나씩 없애보고 BFS를 돌리는 방식으로 답을 구할 수 있습니다.
모든 벽을 순회하는데 O(N2), BFS를 돌리는데 O(N2)이 걸리므로 최종 시간 복잡도는 O(N4) 이 됩니다.
Union Find 사용
인접한 칸을 볼 때 BFS로 탐색을 하는 것이 아니라, Union Find로 합쳐준다고 생각을 해봅시다.
2번 문제는 단순하게 모든 집합(트리)의 사이즈 중 최댓값을 뽑으면 됩니다.
두 방을 Union을 하면 한 방으로 합쳐집니다. 총 방의 개수는 1이 줄어들게 됩니다. 그러므로 N * M - (union 횟수)가 1번 문제의 정답이 됩니다.
이 작업은 Union Find의 연산을 O(N2)번 사용합니다.
마지막으로 3번 문제를 봅시다.
하나의 벽을 제거하여 얻을 수 있는 방의 크기를 구해야 합니다.
인접한 칸이지만 벽으로 인해 union되지 않은 두 방의 크기의 합들을 모두 보면서 최댓값을 구해주면 됩니다.
이 작업도 Union Find의 연산을 O(N2)번 사용합니다.
그러므로 최종 시간 복잡도는 O(N2 * a(N2))입니다.
전체 코드
BFS 사용
1 |
|
Union Find 사용
1 |
|