백준 Gold5 7576 - 토마토

JH·2022년 12월 11일
0

백준 알고리즘

목록 보기
28/29
post-thumbnail

문제

입력

출력

예제

idea 및 정리

한번에 동시에 진행하기 때문에 bfs를 써야 한다고 생각했다.
처음 배열을 입력하며 1인 위치를 시작점으로 add 해준 후 queue를 돌린다.
day를 따로 선언한 후에 같은 level이 진행할 때는 독립적으로 증가하도록 한다.
모두 방문을 한 후에 queue가 종료되면 안익은 사과가 있는지 탐색한다.
visited가 false인 사과가 하나라도 있다면 -1을 반환한다.
없다면 day 반환

Code

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

public class Main {
	static Queue<int[]> queue = new ArrayDeque<>();
	static boolean[][] visited; // 방문관리 배열
	static int array[][];
	static int answer=0;
	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		
		array = new int[M][N];
		visited = new boolean[M][N];
		
		for (int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < N; j++) {
				array[i][j]=Integer.parseInt(st.nextToken());
				if (array[i][j]==1) {
					queue.add(new int[] {i,j,0});
					visited[i][j]=true;
				}
				else if(array[i][j]==-1)
					visited[i][j]=true;
			}
		}
		System.out.println(bfs());
	}
	
	public static int bfs() {
		int[] cur = new int[3];
		int di[]= {-1,0,1,0};
		int dj[]= {0,1,0,-1};
		int dx=0,dy=0,day=0;
		while(!queue.isEmpty()) {
			cur=queue.poll();
			for (int i = 0; i < 4; i++) {
				dx = cur[0]+di[i];
				dy = cur[1]+dj[i];
				day = cur[2];
				if(dx>=0&&dy>=0&&dx<array.length&&dy<array[0].length) {
					if(!visited[dx][dy]&&array[dx][dy]==0) {
						visited[dx][dy]=true;
						queue.add(new int[] {dx,dy,++day});
					}
				}
			}			
		}
		int k;
		for (int i = 0; i < array.length; i++) {
			for (int j = 0; j < array[0].length; j++) {
				if(!visited[i][j])
					return -1;
			}
		}
		return day;
	}
}

결과

0개의 댓글