알고리즘/백준
[백준][삼성 SW 역량 테스트][Gold 5][C++] 14502 연구소
Min:D
2020. 10. 5. 19:00
문제
백준 삼성 SW 역량 테스트 기출 문제 - 14502 연구소 (Gold 5)
14502번: 연구소
인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크�
www.acmicpc.net
문제 풀이
접근 방식
이 문제는 벽 3개를 세운 뒤, 얻을 수 있는 안전 영역 크기의 최댓값을 구하는 문제이다.
우선, 3중 for문으로 벽 3개를 세운 뒤, DFS 함수를 만들어 바이러스를 퍼뜨려주었다.
(입력 받을 때, 바이러스의 위치를 저장하여 BFS 방식으로 바이러스를 퍼뜨려줘도 된다.)
그 후, map에 있는 0의 개수를 세어 안전 영역의 크기를 구해주었다.
이 값을 max값과 비교하여 안전 영역 크기의 최댓값을 구해주었다.
풀이 코드 - C++
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> map;
void DFS(int n, int m, int i, int j) {
if (i + 1 < n && map[i + 1][j] == 0) {
map[i + 1][j] = 2;
DFS(n, m, i + 1, j);
}
if (j + 1 < m && map[i][j + 1] == 0) {
map[i][j + 1] = 2;
DFS(n, m, i, j + 1);
}
if (i - 1 >= 0 && map[i - 1][j] == 0) {
map[i - 1][j] = 2;
DFS(n, m, i - 1, j);
}
if (j - 1 >= 0 && map[i][j - 1] == 0) {
map[i][j - 1] = 2;
DFS(n, m, i, j - 1);
}
}
int main() {
int n, m;
cin >> n >> m;
map.assign(n, vector<int>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> map[i][j];
}
}
vector<vector<int>> copy;
copy = map;
int max = 0;
for (int a = 0; a < n*m; a++) { // 첫 번째
if (map[a / m][a % m] != 0) continue;
for (int b = a + 1; b < n * m; b++) { // 두 번째
if (map[b / m][b % m] != 0) continue;
for (int c = b + 1; c < n * m; c++) { // 세 번째
if (map[c / m][c % m] != 0) continue;
map[a / m][a % m] = 1;
map[b / m][b % m] = 1;
map[c / m][c % m] = 1;
for (int i = 0; i < n; i++) { // 2 퍼뜨리기
for (int j = 0; j < m; j++) {
if (map[i][j] == 2)
DFS(n, m, i, j);
}
}
int count = 0;
for (int i = 0; i < n; i++) { // 0 개수 세기
for (int j = 0; j < m; j++) {
if (map[i][j] == 0)
count++;
}
}
if (max < count) // 최대 0 개수 저장
max = count;
map = copy;
}
}
}
cout << max;
}