문제 및 입출력
저번에 풀어봤던 토마토 문제의 3차원 버전이다
static int[][][] map;
static Queue<Tomato> queue;
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 int M, N, H;
2차원 배열로 구현했던것을 3차원 배열로 변경하고,
가독성을 위해 queue의 자료형을 Tomato 클래스를 만들어서 선언하였다
또한 x,y축에 z축을 추가하여 방향벡터를 설정하였다
for (int z = 0; z < H; z++) {
for (int y = 0; y < N; y++) {
st = new StringTokenizer(br.readLine());
for (int x = 0; x < M; x++) {
map[x][y][z] = Integer.parseInt(st.nextToken());
if (map[x][y][z] == 1) {
queue.add(new Tomato(x, y, z));
}
}
}
}
초기 입력받은 3차원 map의 값이 1이면 새로운 토마토 객체를 생성하여 queue에 즉시 담아주었다
이후에는 이전 평면상의 토마토문제 코드와 특별히 다른점이 없어 최종 코드에 첨부를 하겠다
public class Main {
static int[][][] map;
static Queue<Tomato> queue;
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 int M, N, H;
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());
map = new int[M][N][H];
queue = new LinkedList<>();
for (int z = 0; z < H; z++) {
for (int y = 0; y < N; y++) {
st = new StringTokenizer(br.readLine());
for (int x = 0; x < M; x++) {
map[x][y][z] = Integer.parseInt(st.nextToken());
if (map[x][y][z] == 1) {
queue.add(new Tomato(x, y, z));
}
}
}
}
bfs();
int max = Integer.MIN_VALUE;
for (int z = 0; z < H; z++) {
for (int y = 0; y < N; y++) {
for (int x = 0; x < M; x++) {
if (map[x][y][z] == 0) {
System.out.println(-1);
return;
}
max = Math.max(max, map[x][y][z]);
}
}
}
int result = max - 1;
System.out.println(result);
}
private static void bfs() {
while (queue.size() > 0) {
Tomato tomato = queue.poll();
int curX = tomato.x;
int curY = tomato.y;
int curZ = tomato.z;
for (int i = 0; i < 6; i++) {
int nextRow = curX + dx[i];
int nextCol = curY + dy[i];
int nextZ = curZ + dz[i];
if (0 <= nextRow && nextRow < M && 0 <= nextCol && nextCol < N
&& 0 <= nextZ && nextZ < H
&& map[nextRow][nextCol][nextZ] == 0) {
queue.add(new Tomato(nextRow, nextCol, nextZ));
map[nextRow][nextCol][nextZ] = map[curX][curY][curZ] + 1;
}
}
}
}
private static class Tomato {
int x, y, z;
public Tomato(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
}
}
3차원으로 변경됐기에 가독성과 유연함을 위해 Tomato를 클래스로 선언한것, 2차원 배열에서 3차원배열로 변경한 것 외에 딱히 특별한점이 없는 문제이다