본문 바로가기
프로그래밍 문제/BOJ(백준 온라인 저지)

[BOJ 7569번] 토마토(JAVA)

by 테크케찰 2020. 9. 24.

www.acmicpc.net/problem/7569

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

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

class Dot{
	int x, y, z;
	Dot(int z, int x, int y){
		this.x=x;
		this.y=y;
		this.z=z;
	}
}

class Main{
	
	static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
	static StringBuilder sb=new StringBuilder();
	static int N, M, H, cnt=0;
	static int[][][] map;
//	static boolean[][][] isVisit;
	static int[] dx= {0, 1, 0, -1, 0, 0};
	static int[] dy= {1, 0, -1, 0, 0, 0};
	static int[] dz= {0, 0, 0, 0, 1, -1};
	
	public static void main(String args[]) throws Exception {
		String s[]=br.readLine().split(" ");
		M=Integer.parseInt(s[0]);
		N=Integer.parseInt(s[1]);
		H=Integer.parseInt(s[2]);
		map=new int[H][N][M];
//		isVisit=new boolean[H][N][M];
		for(int k=0;k<H;k++) {
			for(int i=0;i<N;i++) {
				String s1[]=br.readLine().split(" ");
				for(int j=0;j<M;j++) {
					map[k][i][j]=Integer.parseInt(s1[j]);
				}
			}
		}
//		print();
		bfs();
	}
	
	public static void print() {
		for(int k=0;k<H;k++) {
			for(int i=0;i<N;i++) {
				for(int j=0;j<M;j++) {
					System.out.print(map[k][i][j]+" ");
				}
				System.out.println();
			}
			System.out.println("-----------------");
		}
	}
	
	public static void bfs() {
		Queue<Dot> q=new LinkedList<>();
//		토마토가 익었으면 큐에 삽입
		for(int k=0;k<H;k++) {
			for(int i=0;i<N;i++) {
				for(int j=0;j<M;j++) {
					if(map[k][i][j]==1) q.add(new Dot(k, i, j));
				}
			}
		}
		
		while(!q.isEmpty()) {
			Dot dot=q.poll();
			for(int i=0;i<6;i++) {
				int nextX=dot.x+dx[i];
				int nextY=dot.y+dy[i];
				int nextZ=dot.z+dz[i];
//				범위를 벗어난 경우 패스
				if(nextX<0||nextY<0||nextX>=N||nextY>=M||nextZ<0||nextZ>=H) continue;
//				익지 않은 토마토가 아니면 패스,
				if(map[nextZ][nextX][nextY]!=0) continue;
//				현재 위치=전 위치 +1(일수를 계산)
				map[nextZ][nextX][nextY]=map[dot.z][dot.x][dot.y]+1;
				q.add(new Dot(nextZ, nextX, nextY));
			}
		}
		int max=0;
		for(int k=0;k<H;k++) {
			for(int i=0;i<N;i++) {
				for(int j=0;j<M;j++) {
					if(map[k][i][j]==0) {
						System.out.println(-1);
						return;
					}
					max=Math.max(max, map[k][i][j]);
				}
			}
		}
		System.out.println(max-1);
	}
}

지난 번에 풀어보았던 7576번 토마토 문제와 비슷했습니다.

한 가지 차이점은 3차원 배열을 이용했다는 점이었는데요, 이를 이용해서 이전의 코드를 3차원 배열로 바꿔서 다루어서 쉽게 풀 수 있었습니다.

eloquence-developers.tistory.com/113

 

[BOJ 7576번] 토마토(JAVA)

www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄..

eloquence-developers.tistory.com