๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[๋ฐฑ์ค€] 14502๋ฒˆ: ์—ฐ๊ตฌ์†Œ(DFS, BFS, ์™„์ „ํƒ์ƒ‰)

by ์ฃผ๋ฐœ2 2020. 4. 8.
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/14502

 

14502๋ฒˆ: ์—ฐ๊ตฌ์†Œ

์ธ์ฒด์— ์น˜๋ช…์ ์ธ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์—ฐ๊ตฌํ•˜๋˜ ์—ฐ๊ตฌ์†Œ์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์œ ์ถœ๋˜์—ˆ๋‹ค. ๋‹คํ–‰ํžˆ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์•„์ง ํผ์ง€์ง€ ์•Š์•˜๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค์˜ ํ™•์‚ฐ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ์—ฐ๊ตฌ์†Œ์— ๋ฒฝ์„ ์„ธ์šฐ๋ ค๊ณ  ํ•œ๋‹ค. ์—ฐ๊ตฌ์†Œ๋Š” ํฌ๊ธฐ๊ฐ€ N×M์ธ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ง์‚ฌ๊ฐํ˜•์€ 1×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ์—ฐ๊ตฌ์†Œ๋Š” ๋นˆ ์นธ, ๋ฒฝ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๋ฒฝ์€ ์นธ ํ•˜๋‚˜๋ฅผ ๊ฐ€๋“ ์ฐจ์ง€ํ•œ๋‹ค.  ์ผ๋ถ€ ์นธ์€ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์ด ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋นˆ ์นธ์œผ๋กœ ๋ชจ๋‘ ํผ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

www.acmicpc.net

 

์ฝ”๋“œ

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


class Point{
	int x;
	int y;
	Point(int x, int y){
		this.x = x;
		this.y = y;
	}
}

public class Main {
	public static int N, M;			// ์ง€๋„ ํฌ๊ธฐ
	public static int map[][];		// ์ง€๋„
	public static int virusMap[][];	// ์ง€๋„ ๋ณต์‚ฌ๋ณธ
	public static int max = 0;		// ์ตœ๋Œ€ ์˜์—ญ๊ฐฏ์ˆ˜
	public static int[] dx = {0, -1, 0, 1};	// ๋™๋ถ๋‚จ์„œ ๋ฐฉํ–ฅ
	public static int[] dy = {-1, 0, 1, 0};

	/* ์™„์ „ํƒ์ƒ‰ + ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ๋ฒฝ 3๊ฐœ ์„ธ์šฐ๊ธฐ */
	public static void dfs(int count) {

		if(count == 3) {	// ๊ธฐ์ €์‚ฌ๋ก€: ๋ฒฝ 3๊ฐœ ์„ธ์› ์„๊ฒฝ์šฐ
			bfs();
			return;
		}

		for(int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				if(map[i][j] == 0) {	// ๋นˆ๊ณต๊ฐ„ 
					map[i][j] = 1;	// ๋ฒฝ์œผ๋กœ ์„ธ์šฐ๊ธฐ
					dfs(count+1);	// dfs๋กœ ๋ฒฝ 3๊ฐœ๋ฅผ ์„ธ์šธ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
					map[i][j] = 0;	// ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ์„ธ์šด ๋ฒฝ ํ—ˆ๋ฌผ๊ธฐ
				}
			}
		}
	}

	
	/* ๋นˆ ์นธ(0)์ธ ๊ณณ์— ๋ฐ”์ด๋Ÿฌ์Šค(2) ์ฑ„์šฐ๊ธฐ */
	public static void bfs() {
		virusMap = new int[N][M];

		// ์ด์ „์˜  map ๋ณต์‚ฌํ•˜๊ธฐ
		for(int i=0; i<N; i++) 
			for(int j=0; j<M; j++) 
				virusMap[i][j] = map[i][j];	

		Queue<Point> q = new LinkedList<>();
		for(int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				if(virusMap[i][j] == 2) {
					q.add(new Point(i, j));
				}
			}
		}

		while(!q.isEmpty()) {
			Point p = q.poll();
			int x = p.x;
			int y = p.y;

			for(int i=0; i<4; i++) {	// ๋™๋ถ์„œ๋‚จ 4๋ฐฉํ–ฅ ํƒ์ƒ‰
				int nx = x + dx[i];
				int ny = y + dy[i];
				if(nx>=0 && ny>=0 && nx<N && ny<M) {	// map์˜ ๋ฒ”์œ„
					if(virusMap[nx][ny] == 0) {	// ๋นˆ๊ณต๊ฐ„ -> ๋ฐ”์ด๋Ÿฌ์Šค๋กœ ํผ๋œจ๋ฆฐ๋‹ค.
						virusMap[nx][ny] = 2;
						q.add(new Point(nx, ny));
					}
				}
			}
		}
		max = checkVirusCount();		
	}

	
	/* ์•ˆ์ „์˜์—ญ์˜ ๊ฐฏ์ˆ˜ ๊ตฌํ•˜๊ธฐ */
	public static int checkVirusCount() {
		int cnt = 0;
		for(int i=0; i<N; i++) 
			for(int j=0; j<M; j++)
				if(virusMap[i][j] == 0) 
					cnt ++;
		
		return Math.max(max, cnt);
	}

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		map = new int[N][M];

		for(int i=0; i<N; i++) {
			st = new StringTokenizer(bf.readLine());
			for(int j=0; j<M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}

		for(int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				if(map[i][j] == 0) {
					map[i][j] = 1;
					dfs(1);
					map[i][j] = 0;
				}
			}
		}

		System.out.println(max);
		bf.close();
	}
}

ํ’€์ด

dfs + bfs + ์™„์ „ํƒ์ƒ‰ + ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ํ‘ธ๋Š” ๋ฌธ์ œ๋‹ค...

๋ฌธ์ œ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ค์›Œ์„œ ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ๋“ค์„ ์ฐธ๊ณ ํ–ˆ๋‹ค.. ๊ฑฐ์˜ ๊ตฌ๊ธ€์— Java ๊ด€๋ จ ํฌ์ŠคํŒ…์€ ๋‹ค ๋ณธ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

 1) ์™„์ „ํƒ์ƒ‰์„ ํ†ตํ•ด map์˜ ๋ชจ๋“  ๊ณณ์— ๋ฒฝ์„ 3๊ฐœ๋ฅผ ์„ธ์šด๋‹ค.

 2) ๋ฒฝ์ด 3๊ฐœ๊ฐ€ ์„ธ์›Œ์กŒ์œผ๋ฉด, ์ด์ œ map์— ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํผ๋œจ๋ฆด ์ˆ˜ ์žˆ๋Š”๊ณณ์— ๋ชจ๋‘ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํผ๋œจ๋ฆฐ๋‹ค.

 3) ์œ„ ๊ณผ์ •์ด ๋๋‚˜๋ฉด, ์•ˆ์ „์˜์—ญ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ , ์ตœ๋Œ€ ๊ฐฏ์ˆ˜์ธ์ง€ ๋น„๊ตํ•œ๋‹ค.

 

ํ’€์ด๋Š” ๊ฐ„๋‹จํ•œ๋ฐ ์•„์ง bfs๋‚˜ ๋ฐฑํŠธ๋ž˜ํ‚น์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์™„์ „ํ•˜์ง€๊ฐ€ ์•Š์•„์„œ ์ดํ•ดํ•˜๋Š”๋ฐ ํž˜๋“ค์—ˆ๋‹ค.

์ด์ „์— ์‚ฌ์šฉ๋œ map์„ ์‚ฌ์šฉํ• ๊ฒฝ์šฐ, ๋งต์ด ๊ฒน์น˜๊ณ  ์ค‘๋ณต๋˜๊ธฐ๋•Œ๋ฌธ์— ๋ฐ”์ด๋Ÿฌ์Šค๋กœ ์ฑ„์šธ๋•Œ๋Š” map์„ ์ƒˆ๋กœ ์„ ์–ธํ•ด์•ผํ•œ๋‹ค.

 

 

dfs๋‚˜ ๋ฐฑํŠธ๋ž˜ํ‚น์€ ํ™•์‹คํžˆ ์‚ฌ์šฉ๋˜๋Š” ๋กœ์ง์€ ๋น„์Šท๋น„์Šท ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

์ข€ ๋” ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์ดํ•ดํ•˜๊ณ  ๊ฐ์„ ์ตํžˆ๋Š”๊ฒŒ ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€