[문제 링크]
https://www.acmicpc.net/problem/2573
[난이도]
- Gold 4
[알고리즘]
- BFS
[코드]
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static int[][] map;
static boolean[][] visited;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
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());
}
}
int year = 0;
while (true) {
year++;
// 1년 경과 후 빙산의 높이를 줄입니다.
int[][] nextMap = new int[N][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (map[i][j] > 0) {
int count = 0;
for (int d = 0; d < 4; d++) {
int ni = i + dx[d];
int nj = j + dy[d];
if (map[ni][nj] == 0) {
count++;
}
}
nextMap[i][j] = Math.max(0, map[i][j] - count);
}
}
}
map = nextMap;
// 빙산 덩어리 개수를 셉니다.
int count = countIcebergs();
if (count == 0) {
// 모든 빙산이 녹음
System.out.println(0);
break;
} else if (count > 1) {
// 두 개 이상의 덩어리로 분리됨
System.out.println(year);
break;
}
}
}
static int countIcebergs() {
visited = new boolean[N][M];
int count = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (map[i][j] > 0 && !visited[i][j]) {
bfs(i, j);
count++;
}
}
}
return count;
}
static void bfs(int x, int y) {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[] {x, y});
visited[x][y] = true;
while (!queue.isEmpty()) {
int[] current = queue.poll();
int cx = current[0];
int cy = current[1];
for (int d = 0; d < 4; d++) {
int nx = cx + dx[d];
int ny = cy + dy[d];
if (nx >= 0 && nx < N && ny >= 0 && ny < M && map[nx][ny] > 0 && !visited[nx][ny]) {
queue.add(new int[] {nx, ny});
visited[nx][ny] = true;
}
}
}
}
}
[풀이]
문제를 하나하나 풀어 여러 단계로 나누어보면 간단한문제이다.
1. 1년이 지난후의 지도를 새로 작성한다.
2. 새로운 지도의 빙산개수를 센다.
3. 빙산개수가 0개 혹은 2개이상일 경우 종료한다.
4. 빙산개수가 1개일 경우 1~2를 반복한다.
'코딩테스트' 카테고리의 다른 글
백준 2023 : 신기한 소수 [JAVA] (0) | 2024.06.20 |
---|---|
백준 13023 : ABCDE [JAVA] (0) | 2024.06.18 |
백준 13549 : 숨바꼭질 3 [JAVA] (0) | 2024.06.15 |
백준 2589 : 보물섬 [JAVA] (0) | 2024.06.15 |
백준 1389 : 케빈 베이컨의 6단계 법칙 [JAVA] (0) | 2024.06.14 |