• 문제 링크
14502번: 연구소
인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크
www.acmicpc.net
• 풀이 과정
연구소에 벽을 3개 세우는 모든 경우의 수를 재귀적으로 dfs 를 통해 구한다.
이렇게 벽을 세운 각각의 경우의 바이러스 확산을 bfs 를 통해 구현하고
이때 바이러스를 확산시킬 공간은 기존 lab 배열을 복사한 copy 배열을 생성해 구현한다.
바이러스가 확산된 copy 배열을 매개변수로 받아 해당 배열에 존재하는 0의 개수,
즉 안전 영역의 크기를 배열을 전체 탐색하여 구하고
이를 매번 maxCnt와 비교하여 최댓값으로써 갱신하여 정답을 출력한다.
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int n, m;
static int[][] lab;
static int[] dy = { -1, 1, 0, 0 };
static int[] dx = { 0, 0, -1, 1 };
static int maxCnt = Integer.MIN_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
lab = new int[n][m];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < m; j++)
lab[i][j] = Integer.parseInt(st.nextToken());
}
dfs(0);
bw.write(maxCnt + "\n");
bw.flush();
}
private static void dfs(int wall) {
if (wall == 3) {
bfs();
return;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (lab[i][j] == 0) {
lab[i][j] = 1;
dfs(wall + 1);
lab[i][j] = 0;
}
}
}
}
private static void bfs() {
Queue<Node> q = new LinkedList<>();
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (lab[i][j] == 2)
q.offer(new Node(i, j));
}
}
int[][] copy = new int[n][m];
for (int i = 0; i < n; i++)
copy[i] = lab[i].clone();
while (!q.isEmpty()) {
Node now = q.poll();
for (int i = 0; i < 4; i++) {
int ny = now.y + dy[i];
int nx = now.x + dx[i];
if (ny >= 0 && nx >= 0 && ny < n && nx < m) {
if (copy[ny][nx] == 0) {
q.offer(new Node(ny, nx));
copy[ny][nx] = 2;
}
}
}
}
safe(copy);
}
private static void safe(int[][] copy) {
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (copy[i][j] == 0)
cnt++;
}
}
if (maxCnt < cnt)
maxCnt = cnt;
}
private static class Node {
int y;
int x;
Node(int y, int x) {
this.y = y;
this.x = x;
}
}
}
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 14888 연산자 끼워넣기 - Backtracking / Java (0) | 2022.07.03 |
---|---|
[백준] 16236 아기 상어 - Implementation / Java (0) | 2022.07.02 |
[백준] 15685 드래곤 커브 - Implementation / Java (0) | 2022.06.30 |
[백준] 16234 인구 이동 - Implementation / Java (0) | 2022.06.29 |
[백준] 14891 톱니바퀴 - Implementation / Java (0) | 2022.06.28 |
댓글