백준 Q7569 - 토마토(3차원)

유동우·2024년 12월 9일
0

문제 및 입출력


풀이

저번에 풀어봤던 토마토 문제의 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차원배열로 변경한 것 외에 딱히 특별한점이 없는 문제이다

profile
효율적이고 꾸준하게

0개의 댓글