https://www.acmicpc.net/problem/14502
[풀이]
- dfs 메소드는 벽을 3개 세우는 것을 재귀적으로 구현한 부분입니다.
- bfs 메소드는 바이러스가 퍼지는 것을 구현한 부분입니다.
- check 메소드는 안전한 영역의 최대값을 구현한 부분입니다.
- 벽을 3개 세우고 바이러스가 퍼졌을 때 안전한 영역의 개수를 구하므로 dfs 메소드내에 bfs 메소드, bfs 메소드 내에 check 메소드가 위치합니다.
- 즉, dfs 메소드에서 벽을 다 세웠을 경우, bfs 메소드로 바이러스를 뿌리게 됩니다.
- 또한 bfs 메소드에서 바이러스를 다 뿌렸을 경우 안전한 영역을 확인해야하므로 check() 메소드가 마지막에 호출됩니다.
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int N, M;
static int[][] arr, copyArr;
static boolean[][] visited;
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, -1, 0, 1};
static int result = Integer.MIN_VALUE;
static class Point {
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void dfs(int depth) {
if (depth == 3) {
bfs();
return;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (arr[i][j] == 0) {
arr[i][j] = 1;
dfs(depth + 1);
arr[i][j] = 0;
}
}
}
}
public static void bfs() {
int[][] virusArr = new int[N][M];
Queue<Point> queue = new LinkedList<>();
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
virusArr[i][j] = arr[i][j];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (arr[i][j] == 2) {
queue.offer(new Point(i, j));
}
}
}
while (!queue.isEmpty()) {
Point point = queue.poll();
for (int i = 0; i < 4; i++) {
int nextX = point.x + dx[i];
int nextY = point.y + dy[i];
if (nextX >= 0 && nextY >= 0 && nextX < N && nextY < M) {
if (virusArr[nextX][nextY] == 0) {
virusArr[nextX][nextY] = 2;
queue.offer(new Point(nextX, nextY));
}
}
}
}
check(virusArr);
}
public static void check(int[][] arr) {
int count = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (arr[i][j] == 0) {
count += 1;
}
}
}
result = Math.max(result, count);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
arr = new int[N][M];
visited = new boolean[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < M; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
copyArr = arr;
dfs(0);
System.out.println(result);
}
}
'Algorithm > 백준' 카테고리의 다른 글
백준 9663번 : N-Queen(Java) (0) | 2021.10.24 |
---|---|
백준 2292번 : 벌집(Java) (0) | 2021.10.24 |
백준 2468번 : 안전영역(Java) (0) | 2021.10.24 |
백준 10819번 : 차이를 최대로(Java) (0) | 2021.10.19 |
백준 1002번 : 터렛 (Java) (0) | 2021.10.19 |