문제
철수의 토마토 농장에서는 토마토를 보관하는 큰 창고를 가지고 있다. 토마토는 아래의 그림과 같이 격자 모양 상자 칸에 하나씩 넣어서 창고에 보관한다.
창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들도 익을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토의 인접한 곳은 왼쪽, 오른쪽, 앞, 뒤 네 방향에 있는 토마토를 의미한다. 대각선 방향에 있는 토마토들에게는 영향을 주지 못하며, 토마토가 혼자 저절로 익는 경우는 없다고 가정한다. 철수는 창고에 보관된 토마토들이 며칠이 지나면 다 익게 되는지, 그 최수 일수를 알고 싶어한다.
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 Main {
static int map[][];
static int dx[] = {-1,1,0,0};
static int dy[] = {0,0,-1,1};
static Queue<Node> queue = new LinkedList<>();
static int N,M;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[M][N];
for (int i = 0; i < M ; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N ; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
if(map[i][j] == 1) queue.add(new Node(i,j)); //익은 부분에서부터 퍼져야 하기 때문에 먼저 Queue로 받는다.
}
}
bfs();
}
static void bfs(){
while (!queue.isEmpty()){
Node now = queue.poll();
for (int i = 0; i < 4; i++) {
int nx = now.x + dx[i];
int ny = now.y + dy[i];
if(nx < 0 || ny < 0 || nx >= M || ny >= N) continue;
if(map[nx][ny] == 0){
queue.add(new Node(nx,ny));
map[nx][ny] = map[now.x][now.y] + 1; //익는데 걸리는 시간
}
}
}
int solution = Integer.MIN_VALUE;
for (int i = 0; i < M; i++) {
for (int j = 0; j < N ; j++) {
if(map[i][j] == 0) {
System.out.println(-1); //다 안 된경우
return;
}
solution = Math.max(solution,map[i][j]); //익게 만든 것중 가장 큰것
}
}
if(solution == 1) {
System.out.println(0); //다 익어있던 상태여서 기존에 주어진 값을 변경하지 않음
}
else {
System.out.println(solution-1); //제일 큰 값에서 -1을 해줘야함
}
}
static class Node{
int x;
int y;
public Node(int x,int y){
this.x = x;
this.y = y;
}
}
}
'알고리즘' 카테고리의 다른 글
백준 No.18243 Small World Network - JAVA (0) | 2023.05.06 |
---|---|
백준 No.11403 경로 찾기 - JAVA (0) | 2023.05.05 |
백준 No.11497 통나무건너뛰기 - JAVA (0) | 2023.05.03 |
백준 No.18310 안테나 - JAVA (0) | 2023.05.02 |
백준 No.15903 카드 합체 놀이 - JAVA (0) | 2023.04.26 |