BOJ 17142 - 연구소 3

Joonas' Note

BOJ 17142 - 연구소 3 본문

알고리즘/문제 풀이

BOJ 17142 - 연구소 3

2019. 4. 15. 13:53 joonas 읽는데 2분
  • 문제
  • 풀이
  • 코드

링크: https://www.acmicpc.net/problem/17142

문제

연구소에 이미 존재하는 바이러스들 중 m (2m10)개를 활성 상태로 바꾸어 바이러스를 퍼뜨리는 문제이다. 그 때, 연구소의 모든 빈칸에 바이러스가 퍼지게 하는 최소 시간을 구해야 한다.

풀이

연구소에 존재하는 바이러스 들 중 m개를 골라야한다. DFS 같은 방법으로 고를 수 있지만, next_permutation을 사용하면 간단하다.
4개 중 2개를 고르는 조합은 0011 → 0101 → 0110 → 1001 → 1010 → 1100 순으로 진행된다.

#include <cstdio> // printf
#include <algorithm> // next_permutation
using namespace std;
int main() {
int a[4] = {0,0,1,1};
do {
for (int i = 0; i < 4; ++i) printf("%d ", a[i]);
puts("");
} while (next_permutation(a, a + 4));
return 0;
}

이런 특징을 사용하여 매번 적당히 m개를 선택하여 플러드 필(Flood Fill, BFS)을 한다.

모든 빈칸을 방문한다면 그 때의 탐색 시간을, 그렇지 못한다면 을 반환하면서 모든 조합을 확인하여 최소 시간을 구한다. m개 중 2의 개수(10)를 고르는 조합의 수만큼 반복된다.

시간복잡도는 O(10CmN2)

코드

'알고리즘 > 문제 풀이' 카테고리의 다른 글

BOJ 13325 - 이진 트리  (0) 2019.09.16
UVa 10918 - Tri Tiling  (3) 2019.04.15
BOJ 17140 - 이차원 배열과 연산  (0) 2019.04.15
BOJ 14852 - 타일 채우기 3  (0) 2019.03.21
BOJ 9375 - 패션왕 신해빈  (0) 2019.03.21
Comments