알고리즘 문제 풀이

백준 7576 토마토 (Java 자바)

superbono 2021. 3. 25. 23:14

전형적인 bfs 문제이당

package self_study;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class bj7576_토마토 {
	static int map[][];
	static boolean visited[][];
	static int N, M;
	static int res;
	static Queue <Data> q;
	// 상 하 좌 우
	static int dx[] = {-1, 1, 0, 0};
	static int dy[] = {0, 0, -1, 1};
	
	static class Data {
		int x;
		int y;
		int day;
		
		public Data(int x, int y, int day) {
			this.x = x;
			this.y = y;
			this.day = day;
		}
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st =  new StringTokenizer(br.readLine()," ");
		
		M = Integer.parseInt(st.nextToken());
		N = Integer.parseInt(st.nextToken());
		
		map = new int [N][M];
		visited = new boolean [N][M];
		q = new LinkedList<>();
		
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				if(map[i][j] == 1) { // 토마토가 있는 위치라면
					// 방문체크하고 큐에 넣어주기
					visited[i][j] = true;
					q.offer(new Data(i, j, 0));
				} else if(map[i][j] == -1) {
					visited[i][j] = true;
				}
			}
		}
		
		Data cur = null;
		while(!q.isEmpty()) {
			cur = q.poll();
			res  = cur.day;
			
			for(int dir = 0; dir < 4; dir++) {
				int nx = cur.x + dx[dir];
				int ny = cur.y + dy[dir];
				
				if(nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
				
				if(visited[nx][ny] == true || map[nx][ny] == -1) continue;
				
				visited[nx][ny] = true;
				q.offer(new Data(nx, ny, cur.day + 1));
			}
		}
		
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if(!visited[i][j]) {
					res = -1;
					break;
				}
			}
		}
		
		System.out.println(res);
	}
}