코딩테스트-알고리즘/백준 BOJ
[백준 BOJ/Gold V] 7569번 : 토마토
닉네임생각즁
2024. 2. 23. 23:03
https://www.acmicpc.net/problem/7569
아래 문제에서 조금 더 발전된 버전이다
7576번은 2차원 배열 7569번은 3차원 배열..!
3차원 배열로 놓고 z축 기준으로도 -1, 1 해준것을 생각해주면 된다
최종 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.StringTokenizer;
public class Main {
static int M; // 상자의 가로 칸의 수, j
static int N; // 상자의 세로 칸의 수, i
static int H; // H번 반복(수직으로 쌓이는 상자 개수), k
static int[][][] box;
static int[] dx = {-1, 1, 0, 0, 0, 0};
static int[] dy = {0, 0, -1, 1, 0, 0};
static int[] dz = {0, 0, 0, 0, -1, 1};
static Deque<int[]> dq;
static int answer;
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());
box = new int[H][N][M];
dq = new ArrayDeque<>();
int count = 0; // 0 있는지 확인하는 용도
for (int k = 0; k < H; k++) {
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
box[k][i][j] = Integer.parseInt(st.nextToken());
if (box[k][i][j] == 1) dq.addLast(new int[] {k, i, j});
else if (box[k][i][j] == 0) count++;
}
}
}
// System.out.println(Arrays.deepToString(box));
if (count != 0) { // 0이 없으면 계산할 필요가 없음
bfs();
answer = answer - 1; // 처음에 2부터 넣었기 때문에 최종 답은 -1 해야함
loop:
for (int k = 0; k < H; k++) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (box[k][i][j] == 0) {
answer = -1;
break loop;
}
}
}
}
}
System.out.println(answer);
}
static void bfs() {
while (!dq.isEmpty()) {
int[] zxy = dq.pollFirst();
int z = zxy[0];
int x = zxy[1];
int y = zxy[2];
for (int i = 0; i < 6; i++) {
int nz = z + dz[i];
int nx = x + dx[i];
int ny = y + dy[i];
if (nz >=0 && nz < H && nx >=0 && nx < N && ny >= 0 && ny < M) {
if (box[nz][nx][ny] == 0) {
dq.addLast(new int[] {nz, nx, ny});
box[nz][nx][ny] = box[z][x][y] + 1;
}
answer = Math.max(answer, box[nz][nx][ny]);
}
}
}
}
}