Point ๐Ÿ’ก


BFS ํ•จ์ˆ˜๋ฅผ ์ž๋ฐ”๋กœ ์ฒ˜์Œ ์ž‘์„ฑํ•ด๋ดค๋‹ค.

์ฃผ์š” ํ‚ค์›Œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค!

Queue<int[]> queue = new LinkedList<>(); // LinkedList๋กœ ๊ตฌํ˜„
q.offer(new int[] {0,0}); // q์— ์›์†Œ ๋„ฃ๊ธฐ, ํ ์ฐจ์žˆ์„ ๋•Œ false ๋ฐ˜ํ™˜
q.poll(); // q์—์„œ ์›์†Œ ๋นผ๊ธฐ
q.add(new int[] {nx, ny}); // q์— ์›์†Œ ๋„ฃ๊ธฐ, ํ ์ฐจ์žˆ์„ ๋•Œ ์—๋Ÿฌ ๋ฐ˜ํ™˜

๐Ÿ“Œย ์„ค๊ณ„

์ฒ˜์Œ์—๋Š” ์–ด๋–ป๊ฒŒ ์น˜์ฆˆ์˜ ํ…Œ๋‘๋ฆฌ๋งŒ์„ ํŒŒ์•…ํ•˜์ง€? ๋ผ๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

์น˜์ฆˆ๊ฐ€ ์ค‘์‹ฌ์ด ์•„๋‹ˆ๋ผ ๊ณต๊ธฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํƒ์ƒ‰์„ ํ•ด์•ผํ•œ๋‹ค!

๊ณต๊ธฐ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ **1์ด ๋‚˜์˜ค๋ฉด 0์œผ๋กœ ๋ณ€ํ™˜์‹œํ‚ค๊ณ , visited = True๋กœ ๋ณ€๊ฒฝ**ํ•œ๋‹ค. 2๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ, ๊ตณ์ด ๊ทธ๋Ÿดํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค.

์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฏ€๋กœ 0์œผ๋กœ ๋ฐ”๊ฟ”๋„ ๊ทธ ๋…ธ๋“œ๊ฐ€ ํ์— ๋“ค์–ด๊ฐˆ์ผ์ด ์—†์œผ๋ฏ€๋กœ ํ…Œ๋‘๋ฆฌ๋งŒ 0์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

์ด BFS ๊ณผ์ •์„ ์น˜์ฆˆ๊ฐ€ ๋ชจ๋‘ ์—†์–ด์งˆ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

My Solution


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 G2636 {

	static int n, m;
	static int cheese;
	static int[][] graph;
	static boolean[][] visited;
	static int[] dx = {-1, 1, 0, 0};
	static int[] dy = {0, 0, -1, 1};

	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());

		// ์ „์ฒด ์น˜์ฆˆ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.
		graph = new int[n][m];
		for(int i=0; i<n; i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=0; j<m; j++) {
				graph[i][j] = Integer.parseInt(st.nextToken());
				// ์ „์ฒด ์น˜์ฆˆ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.
				if (graph[i][j] == 1) cheese++;
			}
		}

		int cheeseCnt = 0;
		int time = 0;
		while (cheese != 0) {
			cheeseCnt = cheese;
			time ++;
			visited = new boolean[n][m];
			bfs();
		}

		System.out.println(time);
		System.out.println(cheeseCnt);
	}

	public static void bfs() {
		Queue<int[]> q = new LinkedList<>();
		// ํŒ ๊ฐ€์žฅ์ž๋ฆฌ์—๋Š” ์น˜์ฆˆ๊ฐ€ ๋†“์—ฌ์žˆ์ง€์•Š๋‹ค๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ (0,0) ๋ถ€ํ„ฐ ์‹œ์ž‘
		q.offer(new int[] {0, 0});
		visited[0][0] = true;

		while(!q.isEmpty()) {
			int[] current = q.poll();

			for (int i =0; i < 4; i++) {
				int nx = current[0] + dx[i];
				int ny = current[1] + dy[i];

				if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny]) {
					visited[nx][ny] = true;
					if (graph[nx][ny] == 0) {
						// add : ํ๊ฐ€ ๊ฝ‰ ์ฐฌ ๊ฒฝ์šฐ ์—์™ธ ๋ฐœ์ƒ ์‹œํ‚ด
						// offer : ์ถ”๊ฐ€ ์‹คํŒจ๋ฅผ ์˜๋ฏธํ•˜๋Š” false ๋ฆฌํ„ด
						q.add(new int[] {nx, ny});
					} else {
						cheese --;
						// ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฏ€๋กœ ์น˜์ฆˆ๋ฅผ 0์œผ๋กœ ๋ฐ”๊ฟ”๋„ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.
						graph[nx][ny] = 0;
					}
				}
			}
		}

	}
}