03
01

 

 

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

 

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

์ธ์ฒด์— ์น˜๋ช…์ ์ธ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์—ฐ๊ตฌํ•˜๋˜ ์—ฐ๊ตฌ์†Œ์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์œ ์ถœ๋˜์—ˆ๋‹ค. ๋‹คํ–‰ํžˆ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์•„์ง ํผ์ง€์ง€ ์•Š์•˜๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค์˜ ํ™•์‚ฐ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ์—ฐ๊ตฌ์†Œ์— ๋ฒฝ์„ ์„ธ์šฐ๋ ค๊ณ  ํ•œ๋‹ค. ์—ฐ๊ตฌ์†Œ๋Š” ํฌ

www.acmicpc.net


ํ‘ธ๋Š” ๋™์•ˆ ์‚ฌ๊ณ ๊ณผ์ • ๋ฐ ๊ฐœ์„ ์ 

์ „ํ˜•์ ์ธ BFS/DFS๋ฌธ์ œ์˜€๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ ๋„ˆ๋ฌด ์–ด๋ ต๊ฒŒ ์ƒ๊ฐํ–ˆ์—ˆ๋‹ค. 

๋‚ด ๊ฒฝ์šฐ์—๋Š” ๋ฒฝ์„ ๋‘˜ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ขŒํ‘œ๊ฐ’์„ ๋ฝ‘์•„์„œ ๋งค case ๋งˆ๋‹ค BFS๋ฅผ ๋Œ๋ ค ์ตœ๋Œ€ ์•ˆ์ „์˜์—ญ ๊ฐ’์„ ๊ฒ€์ถœํ•˜๋ ค๊ณ ํ–ˆ๋Š”๋ฐ, ๊ฐ€์ง€์น˜๊ธฐ ์—†์ด ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ๋„ฃ์–ด์„œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋Œ๋ ค๋„ ํ†ต๊ณผ๊ฐ€ ๋œ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์ตœ์ ํ™”๋ฅผ ์กฐ๊ธˆ ๋” ํ•œ๋‹ค๋ฉด , 3์ค‘ ํฌ๋ฌธ ๋Œ€์‹ ์— ์žฌ๊ท€๋กœ ์กฐํ•ฉ์„ ๋ฝ‘์•„๋‚ด๋Š” ๋ฐฉ์‹์ด ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์กฐํ•ฉ ํ…œํ”Œ๋ฆฟ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

	static void combination(int start, int n, int r) {
		if (r == 0) {
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < n; i++) {
				if (v[i]) {
					sb.append(numbers[i]);
				}
			}
			return; // return์•ˆํ•ด๋„ ๋˜๊ธดํ•˜๋Š”๋ฐ base case์ž„์„ ์•Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•.
		}

		for (int i = start; i < n; i++) {
			v[i] = true; // ์ค‘๋ณต์—†๋Š” ์กฐํ•ฉ๋ฝ‘๊ธฐ
			combination(i + 1, n, r - 1); // start๋ฅผ ํ•˜๋‚˜ ์˜ฌ๋ฆฌ๊ณ , ๋‚จ์€ ๋ฝ‘์„๊ฑฐ๋ฅผ ํ•˜๋‚˜ ์ค„์ด๋ฉด ๋จ.
			v[i] = false;
		}
	}

r์ด ๋ฝ‘๋Š” ๊ฐœ์ˆ˜๋กœ ๋ช‡๊ฐœ ๋ฝ‘์„ ์ง€๋ฅผ ๋„ฃ์œผ๋ฉด ๋‹ค ๋ฝ‘์•˜์„ ๋•Œ๊ฐ€ base case๋กœ ์žฌ๊ท€๋ฅผ ๋๋‚ด๋Š” ์‹œ์ ์ด ๋œ๋‹ค. ์กฐํ•ฉ์ด ๋‚˜์˜จ๊น€์— ์ˆœ์—ด๋„ ๊ฐ™์ด ๋ณด๋ฉด 

public static void perm(int depth) {
		if (depth == targetDepth) {
			// ์ด๋Ÿฌ๋ฉด ๋‹ค ์ฐพ์€ ๊ฒƒ.
		}
		for (int i = 0; i < numbers.length; i++) {
			if (!v[i]) {
				// ์ด๋Ÿฌ๋ฉด ์ค‘๋ณต์—†๋Š” ์ˆœ์—ด ๋ฝ‘๊ธฐ
				v[i] = true;
				output[depth] = numbers[i];
				perm(depth + 1);
				v[i] = false;
			}
		}
	}

์ด๋ ‡๊ฒŒ ์š”์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

์ˆœ์—ด, ์กฐํ•ฉ๊นŒ์ง€๋Š” ์ด์ œ ๋ฌด๋ฆฌ์—†์ด ๊ฑด๋“œ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ถ€๋ถ„์ง‘ํ•ฉ์€ ์•„์ง ์—ฐ์Šต์ด ํ•„์š”ํ•˜๋‹ค.

import java.util.*;
import java.io.*;

public class Main {
	static int[] di = { -1, 0, 1, 0 };
	static int[] dj = { 0, 1, 0, -1 };

	static int n;
	static int m;
	static int max;

	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("res/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		int[][] map = new int[n][m];
		max = 0;
		List<int[]> blank = new ArrayList<>();
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < m; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		} // 1์€ ๋ฒฝ, 0์€ ๋นˆ์นธ, 2๋Š” ๋ฐ”์ด๋Ÿฌ์Šค, ๊ฒฝ๊ณ„์„ ๋„ ๋ฒฝ์œผ๋กœ ๊ฐ„์ฃผํ•จ
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (map[i][j] == 0) { // ๋ฐ”์ด๋Ÿฌ์Šค ๊ธฐ์ค€ ํƒ์ƒ‰
					blank.add(new int[] { i, j });
				}
			}
		}
		// ์ด์ œ blank์—์„œ 3๊ฐœ ๋ฝ‘์œผ๋ฉด ๋จ
		int len = blank.size();
//		for(int[] i: blank) {
//			System.out.println(Arrays.toString(i));
//		}

		for (int i = 0; i < len; i++) {
			int[] one = blank.get(i);
			for (int j = i + 1; j < len; j++) {
				int[] two = blank.get(j);
				for (int k = j + 1; k < len; k++) {
					int[] three = blank.get(k);
					int[][] copyMap = new int[n][m];
					copy(copyMap, map);
					copyMap[one[0]][one[1]] = 1;
					copyMap[two[0]][two[1]] = 1;
					copyMap[three[0]][three[1]] = 1;
					// ์„ธ ๊ฐœ๋ฅผ ๊ณจ๋ผ์„œ, ๋ณต์‚ฌํ•œ map์— ๋„ฃ๊ณ , bfs๋ฅผ ๋Œ๋ฆฐ๋‹ค.
					bfs(copyMap);
				}
			}
		}

		System.out.println(max);
	}

	private static void copy(int[][] copy, int[][] map) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				copy[i][j] = map[i][j];
			}
		}
	}

	private static void bfs(int[][] copy) {
		LinkedList<int[]> q = new LinkedList<>();
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (copy[i][j] == 2) {
					q.add(new int[] { i, j });
				}
			}
		}

		while (!q.isEmpty()) {
			int[] cur = q.pollFirst();
			for (int i = 0; i < 4; i++) {
				int ni = di[i] + cur[0];
				int nj = dj[i] + cur[1];
				if (ni < n && nj < m && ni >= 0 && nj >= 0 && copy[ni][nj] == 0) {
					q.add(new int[] { ni, nj });
					copy[ni][nj] = 2;
				}
			}
		}
		int safe = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (copy[i][j] == 0) {
					safe++;
				}
			}
		}
		max = Math.max(max, safe);
	}
}

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”! ๋กœ๊ทธ์ธ ์•ˆํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค ^_^

 

๋ฐ˜์‘ํ˜•
COMMENT