본문 바로가기

Algorithm/[BOJ] - JAVA

[백준] 7569 : 토마토 JAVA 풀이

 

7576번과 같은 토마토 문제인데 이번엔 3차원이다.

크게 다를 건 없었지만 이래저래...배열의 인덱스에서 실수를 많이 했다. 

 

 

import java.io.*;
import java.util.*;

public class Main {
	// 토마토 클래스
	static class Tomato{
		int z;
		int x;
		int y;
		
        // 생성자
		Tomato(int z, int x, int y){
			this.z=z;
			this.x=x;
			this.y=y;
		}
	}
	// 위 아래 왼쪽 오른쪽 위 아래
	static int[] dz = {1,-1,0,0,0,0};
	static int[] dx = {0,0,-1,1,0,0};
	static int[] dy = {0,0,0,0,1,-1};
	
	static int M;
	static int N;
	static int H;
	
	static int[][][] box;
	static Queue<Tomato> queue = new LinkedList<>();

	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];
		
		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++) {
					box[i][j][k] = Integer.parseInt(st.nextToken());
					
					if(box[i][j][k]==1) {
                    	// 익은 토마토라면 큐에 넣음
						queue.add(new Tomato(i, j, k));
					}
				}
			}
		}
		System.out.println(bfs());
	}
	
	static int bfs() {
		while(!queue.isEmpty()) {
			Tomato t = queue.poll();

			int z = t.z;
			int x = t.x;
			int y = t.y;
			
			for(int i=0;i<6;i++) {
				int nx = x+dx[i];
				int ny = y+dy[i];
				int nz = z+dz[i];
				
				if(nx>=0&&ny>=0&&nz>=0&&nx<N&&ny<M&&nz<H) {
					if(box[nz][nx][ny]==0) {
						queue.add(new Tomato(nz, nx, ny));
						
						box[nz][nx][ny] = box[z][x][y]+1;
					}
				}
			}
		}
		int result = -999;
		
		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;
					
					result = Math.max(result, box[i][j][k]);
				}
			}
		}
		
		if(result==1) return 0;
		else return result-1;
	}

}