https://www.acmicpc.net/problem/7569


import java.io.*;
import java.util.*;
public class Main {
static int M; // 상자의 가로 칸 수 (가로)
static int N; // 상자의 세로 칸 수 (세로)
static int H; // 쌓아 올려지는 상자의 수 (높이)
static int[][][] arr;
static boolean[][][] visited;
static Queue<int[]> queue = new LinkedList<>();
// 방향
static int[] dh = { -1, 1, 0, 0, 0, 0 }; // 위아래
static int[] dn = { 0, 0, -1, 1, 0, 0 }; // 앞뒤
static int[] dm = { 0, 0, 0, 0, -1, 1 }; // 좌우
static int cnt = -1;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
M = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
H = Integer.parseInt(st.nextToken());
arr = new int[H][N][M];
visited = new boolean[H][N][M];
for (int h = 0; h < H; h++) {
for (int n = 0; n < N; n++) {
st = new StringTokenizer(br.readLine(), " ");
for (int m = 0; m < M; m++) {
int tomato = Integer.parseInt(st.nextToken());
if (tomato == 1) {
queue.offer(new int[] { h, n, m });
visited[h][n][m] = true;
}
arr[h][n][m] = tomato;
}
}
}
// 모든 토마토가 익어 있는 상태 확인
boolean allRipe = true;
for (int h = 0; h < H; h++) {
for (int n = 0; n < N; n++) {
for (int m = 0; m < M; m++) {
if (arr[h][n][m] == 0) {
allRipe = false;
}
}
}
}
if (allRipe) {
System.out.println(0);
return;
}
bfs();
// BFS 종료 후, 익지 않은 토마토가 있는지 확인
for (int h = 0; h < H; h++) {
for (int n = 0; n < N; n++) {
for (int m = 0; m < M; m++) {
if (arr[h][n][m] == 0) {
System.out.println(-1);
return;
}
}
}
}
System.out.println(cnt);
}
public static void bfs() {
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
int[] currentTomato = queue.poll();
int currentTomatoH = currentTomato[0];
int currentTomatoN = currentTomato[1];
int currentTomatoM = currentTomato[2];
// 6방향 탐색
for (int j = 0; j < 6; j++) {
int nextH = currentTomatoH + dh[j];
int nextN = currentTomatoN + dn[j];
int nextM = currentTomatoM + dm[j];
if (nextH >= 0 && nextH < H && nextN >= 0 && nextN < N && nextM >= 0 && nextM < M) {
if (!visited[nextH][nextN][nextM] && arr[nextH][nextN][nextM] == 0) {
visited[nextH][nextN][nextM] = true;
arr[nextH][nextN][nextM] = 1;
queue.offer(new int[] { nextH, nextN, nextM });
}
}
}
}
cnt++; // 하루 경과
}
}
}'Algorithm Solving > Java' 카테고리의 다른 글
| [BOJ] 백준 2468번 : 안전 영역 - Java (1) | 2024.12.30 |
|---|---|
| [BOJ] 백준 7562번 : 나이트의 이동 - Java (0) | 2024.12.30 |
| [BOJ] 백준 1697번 : 숨바꼭질 - Java (1) | 2024.12.26 |
| [BOJ] 백준 10828번 : 스택 - Java (0) | 2024.12.26 |
| [BOJ] 백준 1929번 : 소수 구하기 - Java (1) | 2024.12.23 |