2 λΆ„ μ†Œμš”

πŸ“ [G5_7569] ν† λ§ˆν† 

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 Main {

	static class tomato {
		int x;
		int y;
		int z;

		public tomato(int x, int y, int z) {
			this.x = x;
			this.y = y;
			this.z = z;
		}
	}

	static int M, N, H, cnt;
	static int[][][] box;
	static int[] dx = { 0, 0, 1, -1, 0, 0 };
	static int[] dy = { 1, -1, 0, 0, 0, 0 };
	static int[] dz = { 0, 0, 0, 0, 1, -1 };
	static Queue<tomato> queue;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		// **** input start ****
		M = Integer.parseInt(st.nextToken());
		N = Integer.parseInt(st.nextToken());
		H = Integer.parseInt(st.nextToken());

		box = new int[H][N][M];

		queue = new LinkedList<tomato>();

		for (int i = 0; i < H; i++) {
			for (int j = 0; j < N; j++) {
				st = new StringTokenizer(br.readLine(), " ");
				for (int z = 0; z < M; z++) {
					box[i][j][z] = Integer.parseInt(st.nextToken());
					// 읡은 ν† λ§ˆν† λΌλ©΄ queue 에 μ‚½μž…
					if (box[i][j][z] == 1)
						queue.add(new tomato(z, j, i));
				}
			}
		}
		// **** input end ****

		System.out.println(BFS());

	} // main end

	public static int BFS() {
		// 큐가 λΉŒλ•ŒκΉŒμ§€
		while(!queue.isEmpty()) {
			tomato to = queue.poll();

			int x = to.x;
			int y = to.y;
			int z = to.z;

			int nx,ny,nz;
			for(int i=0; i<6; i++) {
				nx = x + dx[i];
				ny = y + dy[i];
				nz = z + dz[i];

				// λ²”μœ„ μ•ˆμ—μ„œ 체크
				if(nx>=0 && ny>=0 && nz>=0 && nx<M && ny<N && nz<H) {
					// ν† λ§ˆν† κ°€ μ•ˆμ΅μ—ˆμœΌλ©΄
					if(box[nz][ny][nx]==0) {
						// ν† λ§ˆν†  μ΅ν˜€μ„œ μΆ”κ°€
						queue.add(new tomato(nx, ny, nz));

						// 읡은 λ‚  + 1
						box[nz][ny][nx] = box[z][y][x] + 1;
					}
				}
			}
		}
			// μ΅œλŒ€ λ‚ μ§œ
			int res = 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(box[i][j][k] == 0) return -1;

						// μ’Œν‘œμ—λŠ” λ‚ μ§œλ“€μ΄ μ €μž₯λ˜μ–΄ μžˆλ‹€.
						res = Math.max(res, box[i][j][k]);
					}
				}
			}

			// λŒκΈ°μ „μ— 이미 λ‹€ 읡은 ν† λ§ˆν† λ§Œ μžˆλŠ” 경우
			if(res == 1) return 0;

			// μ΅œλŒ€λ‚ μ§œμ—μ„œ 1λΉΌμ£ΌκΈ°
			else return res-1;
		}
} // class end

πŸ€” λ‚˜μ˜ 생각

μ²˜μŒμ— μ™„νƒμœΌλ‘œ ν’€μ—ˆμœΌλ‚˜.. μ‹œκ°„μ΄ˆκ³Όλ‘œ μ‹€νŒ¨ .. γ…Ž
κ·Έλž˜μ„œ μ°Ύμ•„λ³Έ κ²°κ³Ό queue + bfs λ₯Ό ν™œμš©ν•˜λŠ” 것을 μ•Œ 수 μžˆμ—ˆλ‹€.
λ‚΄κ°€ μ—¬κΈ°μ„œ μΊμΉ˜ν•˜μ§€ λͺ»ν•œ 것은 μ‹œκ°„μ„ μ²΄ν¬ν•˜λŠ” 방법이닀..
찾은 λ°©λ²•μ—μ„œλŠ” μ‹œκ°„μ²΄ν¬λ₯Ό box에 +1 μ”© ν•΄κ°€λ©΄μ„œ λ‚˜μ€‘μ— 전체 μ’Œν‘œλ₯Ό λŒλ©΄μ„œ κ°€μž₯ 큰 μ’Œν‘œκ°’(μ‹œκ°„)을 κ°€μ Έμ˜€λŠ” 것이닀.
이 방법을 μ•„μ˜ˆ μƒκ°ν•˜μ§€ λͺ»ν–ˆλŠ”데 .. 휴우 그리고 queue μ“°λŠ” 것도 μƒκ°ν•˜μ§€ λͺ»ν–ˆλ”°..
μŠ¬ν”„κ΅°
방법은 λ‹€μŒκ³Ό κ°™λ‹€.

  • queue에 읡은 ν† λ§ˆν†  μ €μž₯
  • bfs둜 6λ°©ν–₯ 탐색을 톡해 ν† λ§ˆν† κ°€ μ•ˆμ΅μ—ˆμœΌλ©΄ 읡히고 κ·Έ μžλ¦¬μ— κ·Έμ „ box κ°’ + 1 ν•΄μ„œ μ‹œκ°„ 체크
    • κ²°κ΅­ box에 μ €μž₯λ˜λŠ” 값은 μ‹œκ°„ κ°’
  • queueκ°€ 빌 λ•Œ κΉŒμ§€ λŒμ•„μ£Όκ³  λ‹€ 돌고 λ‚˜μ„œ κ²°κ³Όκ°’ 좜λ ₯
    • μ•ˆμ΅μ€ ν† λ§ˆν† κ°€ 있으면 -1
    • λŒκΈ°μ „μ— 이미 ν† λ§ˆν† κ°€ λ‹€ μ΅μ—ˆλ‹€λ©΄ 0
    • 이상이 μ—†λ‹€λ©΄ μ΅œλŒ€κ°’μ—μ„œ -1 ν•΄μ£ΌκΈ° ( 이미 1듀이 μ €μž₯λ˜μ–΄ μžˆμ—ˆκΈ° λ•Œλ¬Έμ— )