공부/Algorithms w.Java

백준 7569; Java

thegreatjy 2022. 1. 17. 02:49
728x90

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

 

7569번: 토마토

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

www.acmicpc.net

 

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

public class Main {
	static int N,M,H;
	static int [][][] map;
	static boolean[][][] near;//상하좌우앞뒤에 익은 토마토가 있는 지 없는 지 
	
	//상하좌우앞뒤
	static int[] row= {0, 0, -1, 1, 0, 0};
	static int[] col= {0, 0, 0, 0, 1, -1};
	static int[] dim= {1, -1, 0, 0, 0, 0};
	
	static class node{
		int x, y, z;
		node(int x, int y, int z){
			this.x=x;
			this.y=y;
			this.z=z;
		}
	}
	
	public static void main(String[] args)throws Exception {
		// 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());
		
		map=new int[H][N][M];
		near=new boolean[H][N][M];
		Queue<node> q=new LinkedList<>();	//새로 익은 토마토를 넣어준다.
		int zeros=0;
		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++) {
					map[i][j][k]=Integer.parseInt(st.nextToken());
					if(map[i][j][k]==1)	q.offer(new node(j, k, i));
					else if(map[i][j][k]==0)	zeros++;
				}
			}
		}
		int days=0;
		while(!q.isEmpty() && zeros!=0) {
			if(zeros==0) {
				break;
			}
			int s=q.size();
			for(int qs=0;qs<s;qs++) {
				node nd=q.poll();
				for(int a=0;a<6;a++) {
					int nx=nd.x+row[a];
					int ny=nd.y+col[a];
					int nz=nd.z+dim[a];
					
					if(nx<0||nx>=N||ny<0||ny>=M||nz<0||nz>=H)	continue;
					if(map[nz][nx][ny]==0) {//주변의 안 익은 토마토 발견 
						q.offer(new node(nx, ny, nz));
						map[nz][nx][ny]=1;	//익힘 
						zeros--;
					}
				}
			}
			days++;
		}
		
		if(zeros!=0) {//안익은 토마토가 존재한다. 
			days=-1;
		}
		System.out.println(days);
	}
}

 

3차원이 어렵다면 7576번을 먼저 풀고 이 문제를 푸는 걸 추천한다.

 

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

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

 

728x90