Algorithm & SQL/BOJ
[백준 14502번 / Java] BOJ 14502 : 연구소(BFS, DFS, 브루트포스)
김룹
2024. 3. 26. 15:39
14502번: 연구소
인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크
www.acmicpc.net
👇내가 작성한 코드
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 max = Integer.MIN_VALUE;
static int[][] map;
static int[][] copyMap;
static int[] dr = {-1, 0, 1, 0};
static int[] dc = {0, 1, 0, -1};
static Queue<int[]> q = new LinkedList<>();
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());
map = new int[N][M];
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
dfs(0);
System.out.println(max);
}
// 벽 세우기
public static void dfs(int wall) {
// 벽이 3개 세워지면, 해당 map에서 bfs돌리며 바이러스 뿌리기
if(wall == 3) {
bfs();
return;
}
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
if(map[i][j] == 0) {
map[i][j] = 1;
dfs(wall + 1);
map[i][j] = 0;
}
}
}
}
// 바이러스 뿌리는 메소드
public static void bfs() {
copyMap = new int[N][M];
for(int i = 0; i < N; i++) {
copyMap[i] = map[i].clone();
for(int j = 0; j < M; j++) {
if(map[i][j] == 2) q.add(new int[] {i, j});
}
}
while(!q.isEmpty()) {
int[] cur = q.poll();
int x = cur[0];
int y = cur[1];
for(int d = 0; d < 4; d++) {
int nr = dr[d] + x;
int nc = dc[d] + y;
if(nr >= 0 && nc >= 0 && nr < N && nc < M && copyMap[nr][nc] == 0) {
copyMap[nr][nc] = 2;
q.add(new int[] {nr, nc});
}
}
}
safeZone(copyMap);
}
// 안전한 공간(0)의 칸 세고 최댓값 갱신
public static void safeZone(int[][] copyMap) {
int cnt = 0;
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
if(copyMap[i][j] == 0) cnt++;
}
}
max = Math.max(max, cnt);
}
}
느낀 점 및 정리 ✍️
1. DFS를 이용하여 벽 3군데 세운 뒤, 해당 2차원 배열을 BFS로 돌며 바이러스 뿌린다. 바이러스 뿌리는 배열은 clone해서 사용하였음. 다 뿌린 뒤 안전한 영역의 칸을 세고, 최댓값 갱신해주었다.