뚱땅뚱땅

[문제] 백준 7569번 토마토 본문

알고리즘/백준

[문제] 백준 7569번 토마토

양순이 2021. 2. 11. 08:02
728x90

www.acmicpc.net/problem/7569

 

7569번: 토마토

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

www.acmicpc.net

 

내 풀이

 

kong-ambition09.tistory.com/90

 

[문제] 백준 7576번 토마토

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

kong-ambition09.tistory.com

위의 문제에서 차원을 하나 높인 동일한 문제다.

 

여기서 내가 헷갈렸던건 x,y,z 좌표였다. 이 부분 주의할 것!

public class BOJ_7569 {
	static int[] dz = { 1, -1, 0, 0, 0, 0 }; // 위 아래 왼 오 앞 뒤
	static int[] dx = { 0, 0, 0, 0, 1, -1 };
	static int[] dy = { 0, 0, -1, 1, 0, 0 };
	
	static int H, N, M;	// 상자 크기
	static int[][][] board;

	static Queue<int[]> q = new LinkedList<>();	// 익은 토마토의 좌표 담기
	static int[][][] visited;	// 소요된 기간 & 방문 체크
	
	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine());

		M = Integer.parseInt(st.nextToken());
		N = Integer.parseInt(st.nextToken());
		H = Integer.parseInt(st.nextToken());
		board = new int[M][N][H];
		visited = new int[M][N][H];
		
		//init board, visited
		for(int k=0;k<H;k++) {
			for(int j=0;j<N;j++) {
				st = new StringTokenizer(in.readLine()," ");
				for(int i=0;i<M;i++) {
					int tmp = Integer.parseInt(st.nextToken());
					board[i][j][k] = tmp;
					if(tmp == 1) {// 익은 토마토에 대하여
						q.offer(new int[] {i,j,k});	// 좌표 큐에 넣기
					}
					else if(tmp == 0) {	//안익은 토마토에 대하여
						visited[i][j][k] = -1;	// 아직 안익은거 표시
					}
				}
			}
		}
		
		while(!q.isEmpty()) {
			int[] current = q.poll();
			// 현재 익은 토마토의 좌표와 소요 기간
			int x =current[0];
			int y = current[1];
			int z = current[2];
			int day = visited[current[0]][current[1]][current[2]];
			
			// 주위 탐색
			for(int d=0;d<6;d++) {
				int nx = x + dx[d];
				int ny = y + dy[d];
				int nz = z + dz[d];
				// 상자 내부에 있는지 확인
				if(nx>=0&&nx<M && ny>=0 && ny<N && nz>=0 && nz<H) {
					// 아직 안익은 토마토에 대해
					if(visited[nx][ny][nz] == -1) {
						visited[nx][ny][nz] = day+1; // 현재보다 하루 더 걸리니까
						q.offer(new int[] {nx, ny, nz});// 익었으니 큐에 삽입 
					}
				}
			}
		}
		
		int ans = 0;
		
		for(int k=0;k<H;k++) {
			for(int j=0;j<N;j++) {
				for(int i=0;i<M;i++) {
					if(visited[i][j][k] == -1) {// 못익은 토마토
						System.out.println(-1);
						return;
					}
					ans = Math.max(ans, visited[i][j][k]);// 최종 소요일
				}
			}
		}
		System.out.println(ans);
		
	}
}

 

 

 

728x90
Comments