티스토리 뷰

코딩테스트/백준

[BJ] 7569. 토마토

jhk828 2021. 2. 14. 03:26

7569.  토마토

www.acmicpc.net/problem/7569

 

7569번: 토마토

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

www.acmicpc.net

 

높이까지 추가된 3차원이라고 해서 풀이가 달라지지 않는다. 

단!!! 높이의 경우 위, 아래만 달라지고 행과 열은 그대로이기 때문에!!! 
dh, dr, dc로 3중 for문을 돌리지 않고,
높이가 위 아래로 달라지는 경우와 / 상하좌우 탐색 두 경우로 나누어 탐색하여야 한다.

 

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

// 210214

public class Main_BJ_7569_토마토 {
	static int M, N, H; // M은 가로, N은 세로
	static int[][][] map;
	static int[][][] dist;
	static Queue<Integer[]> q;
	static int[] dr = {-1, 0, 1, 0};
	static int[] dc = {0, -1, 0, 1};
	
	static void bfs() {
		while(!q.isEmpty()) {
			Integer[] v = q.poll(); // h, r, c 순
			int h = v[0], r = v[1], c = v[2];
			
			// h 먼저
			int nh=0;
			for(int hh=0; hh<2; hh++) {
				if (hh==0) nh = h-1;
				else nh = h + 1;
				if (nh>=0 && nh<H && map[nh][r][c]==0 && dist[nh][r][c]==0) {
					map[nh][r][c]=1;
					dist[nh][r][c]= dist[h][r][c] + 1;
					q.offer(new Integer[] {nh, r, c});
				}
			}
			// 상하좌우
			for(int d=0; d<4; d++) {
				int nr = r + dr[d], nc = c + dc[d];
				if (nr>=0 && nr<N && nc>=0 && nc<M && 
						map[h][nr][nc]==0 && dist[h][nr][nc]==0) {
					map[h][nr][nc]=1;
					dist[h][nr][nc]= dist[h][r][c] + 1;
					q.offer(new Integer[] {h, nr, nc});
				}
			}
		}
	}
	
	static int check() {
		int max = 0;
		for(int h=0; h<H; h++) {
			for(int r=0; r<N; r++) {
				for(int c=0; c<M; c++) {
					if (map[h][r][c]==0) return -1;
					else max = Math.max(max, dist[h][r][c]);
				}
			}
		}
		return max;
	}
	
	public static void main(String[] args) throws Exception {
		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];
		dist = new int[H][N][M];
		q = new ArrayDeque<Integer[]>();
		

		for(int h=0; h<H; h++) {
			for(int r=0; r<N; r++) {
				st = new StringTokenizer(br.readLine(), " ");
				for (int c=0; c<M; c++) {
					map[h][r][c] = Integer.parseInt(st.nextToken());
					if (map[h][r][c]==1) q.offer(new Integer[] {h, r, c});
				}
			}
		}
		
		bfs();
		System.out.println(check());
		br.close();
	}
}

'코딩테스트 > 백준' 카테고리의 다른 글

[BJ] 1707. 이분 그래프  (0) 2021.02.15
[BJ] 2667. 단지번호붙이기  (0) 2021.02.15
[BJ] 2606. 바이러스  (0) 2021.02.14
[BJ] 1260. DFS와 BFS  (0) 2021.02.14
[BJ] 11650. 좌표 정렬하기  (0) 2021.02.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함