토마토


백준 7576: 토마토

문제보기
Alt text

풀이

BFS를 이용
저장될때부터 모든 토마토가 익었는지 확인, BFS 계산 후 익지 않은 토마토가 있는지 확인을 위해 for문을 통해 2차원 배열을 확인하기

소스코드

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	static class Node {
		int r, c, day;

		Node(int r, int c, int day) {
			this.r = r;
			this.c = c;
			this.day = day;
		}

		@Override
		public String toString() {
			return "Node [r=" + r + ", c=" + c + ", day=" + day + "]";
		}

	}

	static int dr[] = { -1, 1, 0, 0 };
	static int dc[] = { 0, 0, -1, 1 };

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int M = sc.nextInt(); // 상자 가로 칸의 수(열)
		int N = sc.nextInt(); // 상자 세로 칸의 수(행)
		int[][] box = new int[N][M];
		Queue<Node> queue = new LinkedList<>();
		int day = 0;
		
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				box[i][j] = sc.nextInt();
				if (box[i][j] == 1)
					queue.add(new Node(i, j, 0));
			}
		}

		// 저장될때부터 모든 토마토가 익어있으면 0 출력
		boolean flag = true;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if (box[i][j] == 0)
					flag = false;
			}
		}
		
		if (!flag) {	//안익은 토마토가 있다면
			while (!queue.isEmpty()) {
				Node node = queue.poll();
				for (int d = 0; d < 4; d++) {
					int nr = node.r + dr[d];
					int nc = node.c + dc[d];

					if (nr >= 0 && nc >= 0 && nr < N && nc < M) {
						if (box[nr][nc] == 0) { // 익지 않은 토마토들이 있다면
							box[nr][nc] = 1;
							queue.add(new Node(nr, nc, node.day + 1));
						}
					}
				}
				day = node.day;
			}
			
			//토마토가 모두 익었는지 안익었는지 확인
			boolean check = true;
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < M; j++) {
					if(box[i][j]==0)	//안익은 토마토가 존재
						check=false;
				}
			}
			
			if(check) {
				System.out.println(day);
			}else {
				System.out.println(-1);
			}
		}
		else {	//처음부터 토마토가 다 익어있는 경우
			System.out.println(0);
		}
	}
}