https://www.acmicpc.net/problem/14502
ํธ๋ ๋์ ์ฌ๊ณ ๊ณผ์ ๋ฐ ๊ฐ์ ์
์ ํ์ ์ธ 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);
}
}
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ํด๋ ๋ฉ๋๋ค ^_^
'OJ๐ผ > ์ค๋ต๋ ธํธ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][JAVA] 17070๋ฒ: ํ์ดํ ์ฎ๊ธฐ๊ธฐ 1 (0) | 2024.03.03 |
---|---|
[SWEA][JAVA] 1949. [๋ชจ์ SW ์ญ๋ํ ์คํธ] ๋ฑ์ฐ๋ก ์กฐ์ฑ (0) | 2024.03.01 |
[BOJ][JAVA] 1918๋ฒ: ํ์ ํ๊ธฐ์ (0) | 2024.02.17 |
[BOJ][JAVA] 14267๋ฒ: ํ์ฌ ๋ฌธํ 1 (0) | 2024.02.12 |
[BOJ][JAVA] 11725๋ฒ: ํธ๋ฆฌ์ ๋ถ๋ชจ์ฐพ๊ธฐ (0) | 2024.02.10 |