Algorithm

[BOJ_7576] ํ† ๋งˆํ†  (๊ณจ๋“œ 5) - JAVA

์ด์ˆ˜๋ฐˆ 2023. 10. 11. 16:59


๐Ÿพ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • BFS (๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰) ์„ ํ™œ์šฉํ•œ ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋ธํƒ€๋ฅผ ์ด์šฉํ•œ 4๋ฐฉ ํƒ์ƒ‰

๐Ÿพ ์ƒ๊ฐ ํฌ์ธํŠธ

  • ์ฒ˜์Œ์—๋Š” r,c,day๋ฅผ ๋‹ด๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ๋ฐฐ์—ด์„ ๋‹ด๋Š” ํ๋กœ ์ƒ์„ฑํ–ˆ์—ˆ๋Š”๋ฐ, ํ† ๋งˆํ† ๊ฐ€ ๋ณต์ˆ˜๊ฐœ์ผ ๋•Œ ๋™์‹œ์— ์ต๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ„๊ณผํ•˜์—ฌ์„œ ๋ฌธ์ œ๊ฐ€ ์ž˜ ํ’€๋ฆฌ์ง€ ์•Š์•˜๋‹ค. (๋™์‹œ์— ์ต๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด, box์˜ ๊ฐ’์ด 1์ผ ๋•Œ queue.addํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 1์ธ(์ต์€ ํ† ๋งˆํ† ) ์ขŒํ‘œ๋“ค์„ ํ์— ๋‹ด์•„์ฃผ๊ณ  bfs ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 
  • ๋‘๋ฒˆ์งธ ์‹œ๋„๋กœ, r, c, day๋ฅผ ๋‹ด๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ , ๊ทธ ๋•Œ, ๊ฐ’์ด 1์ธ ์ขŒํ‘œ๋“ค์„ ์ €์žฅํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ArrayList๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค. (isOneList) → new tomato ์ฃผ์˜ !!
  • day๋ฅผ ์ €์žฅํ•ด์ค„ ๋ณ€์ˆ˜(์–˜๋„ day) ์ƒ์„ฑํ•˜์—ฌ day๋ฅผ ๋งˆ์ง€๋ง‰์— ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ๊ฒƒ.
  • check ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋งˆ์ง€๋ง‰ ๋‚ ์— ์•ˆ์ต์€ ํ† ๋งˆํ†  (0) ์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

 


๐Ÿพ ์†Œ์Šค์ฝ”๋“œ

package boj;

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

class Tomato {
	int r;
	int c;
	int day;

	public Tomato(int r, int c, int day) {
		super();
		this.r = r;
		this.c = c;
		this.day = day;
	}

}

public class Main {

	static int M;
	static int N;
	static int[][] box;
	static Queue<Tomato> queue = new LinkedList<>();
	static ArrayList<Tomato> isOneList;

	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()); // ์„ธ๋กœ

		box = new int[N][M];
		isOneList = new ArrayList<>();
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < M; j++) {
				box[i][j] = Integer.parseInt(st.nextToken());
				if (box[i][j] == 1) {
					isOneList.add(new Tomato(i, j, 0)); //๊ฐ’์ด 1์ธ ์• ๋“ค์„ ๋‹ด์•„์ค„ ๋ฆฌ์ŠคํŠธ
				}
			}
		} // ์ž…๋ ฅ๋

		bfs(M, N);
	}

	private static void bfs(int r, int c) {
		queue = new LinkedList<>();

		for (int i = 0; i < isOneList.size(); i++) {
			queue.add(isOneList.get(i));
		}

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

		int day = 0;
		while (!queue.isEmpty()) {

			Tomato t = queue.poll();
			day = t.day;
			for (int d = 0; d < 4; d++) {
				int nr = t.r + dr[d];
				int nc = t.c + dc[d];
				if (nr >= 0 && nc >= 0 && nr < N && nc < M) {
					if (box[nr][nc] == 0) {
						box[nr][nc] = 1;
						queue.add(new Tomato(nr, nc, day + 1));
					}

				}
			}
		}

		if (check()) {
			System.out.println(day);
		} else {
			System.out.println(-1);
		}

	}

	private static boolean check() {
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if (box[i][j] == 0)
					return false;
			}
		}
		return true;
	}
}

๐Ÿ˜ต‍๐Ÿ’ซ ๊ณต๋ถ€ํ•ด์•ผ ํ•  ์ 

  • class ๋งŒ๋“œ๋Š” ์—ฐ์Šต
  • ๊ทธ class ์— ๋‹ด์€ ๋ณ€์ˆ˜๋ฅผ ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ์Šต
  • cnt ํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ๋Š” ๋ฉ”์†Œ๋“œ์— ์ธ์ž๋กœ ๊ฐ™์ด ๋‹ด์•„์ฃผ์ž.