[백준] 7569_토마토

김태민·2022년 5월 11일
0

알고리즘

목록 보기
58/77

mingssssss

1. 문제

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


2. 코드

package mymain;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BOJ_7569 {

	static int[][][] list;
	static Queue<int[]> q;
	static int M;
	static int N;
	static int H;
	static int answer;
	static int[] dx = { -1, 0, 1, 0, 0, 0 }; // 상하좌우위아래
	static int[] dy = { 0, 1, 0, -1, 0, 0 }; // 상하좌우위아래
	static int[] dz = { 0, 0, 0, 0, 1, -1 }; // 상하좌우위아래

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		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());

		list = new int[H][N][M];
		q = new LinkedList<>();

		for (int i = 0; i < H; i++) {
			for (int j = 0; j < N; j++) {
				st = new StringTokenizer(br.readLine());
				for (int k = 0; k < M; k++) {
					list[i][j][k] = Integer.parseInt(st.nextToken());

					if (list[i][j][k] == 1) {
						q.add(new int[] { i, j, k });
					}
				}
			}
		}
		System.out.println(bfs());
		// 입력 종료

//		// 출력
//		System.out.println("**********");
//		for (int i = 0; i < H; i++) {
//			for (int j = 0; j < N; j++) {
//				for (int k = 0; k < M; k++) {
//					System.out.printf("%d ", list[i][j][k]);
//				}
//				System.out.println();
//			}
//		}

	}

	private static int bfs() {

		while (!q.isEmpty()) {

			int[] now = q.poll();

			for (int i = 0; i < 6; i++) {

				int nextZ = now[0] + dz[i];
				int nextX = now[1] + dx[i];
				int nextY = now[2] + dy[i];

				if (nextX < 0 || nextY < 0 || nextZ < 0 || nextX >= N || nextY >= M || nextZ >= H) {
					continue;
				}

				if (list[nextZ][nextX][nextY] != 0) {
					continue;
				}

				q.add(new int[] { nextZ, nextX, nextY });
				list[nextZ][nextX][nextY] = list[now[0]][now[1]][now[2]] + 1;

			}
		}

		int answer = Integer.MIN_VALUE;

		for (int i = 0; i < H; i++) {
			for (int j = 0; j < N; j++) {
				for (int k = 0; k < M; k++) {

					if (list[i][j][k] == 0) {
						return -1;
					}

					answer = Math.max(answer, list[i][j][k]);
				}
			}
		}

		if (answer == 1) {
			return 0;
		} else {
			return answer - 1;
		}
	}

}

3. 리뷰

3차원 배열 bfs 탐색 문제이다

3차원 배열 자체가 있는게 이 문제를 통해 처음 알았다.

문제 자체는 어렵지 않지만, 3차원 배열을 다루는 것이 익숙치가 않아서 어려웠다.

기본 풀이는 bfs와 동일하지만, Z축(높이)를 하나 더 만들어서

6방향 탐색을 3차원으로 했다.

3차원 배열을 쓸 일이 다시 있을 지는 모르겠지만, 새로운 풀이법을 배워서 좋았다.

profile
어제보다 성장하는 개발자

0개의 댓글