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

처음 봤을 때 dfs로 푸는 문제인건 알겠는데 벽을 세우되 꼭 세개를 세우래서 벽을 어떻게 세울까 고민을 많이 했는데 어떤 기준을 가지고 하기에는 고려할 점이 너무 많았다.
[첫째 줄에 지도의 세로 크기 N과 가로 크기 M이 주어진다. (3 ≤ N, M ≤ 8)]
-> 지도의 넓이 범위가 생각보다 크지 않은 것을 보고 브루트 포스가 아닐까 하고 6중 포문으로 전체 탐색 후 각 케이스마다 DFS를 돌려봤는데 성공했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] a = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int[][] map = new int[a[0]][a[1]];
List<String> vList = new ArrayList<>();
for (int i = 0; i < map.length; i++) {
map[i] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
for (int j = 0; j < map[i].length; j++) {
if (map[i][j] == 2) {
vList.add(i + " " + j);
}
}
}
int count = Integer.MIN_VALUE;
for (int i1 = 0; i1 < map.length; i1++) {
for (int j1 = 0; j1 < map[0].length; j1++) {
if (map[i1][j1] != 0) continue;
map[i1][j1] = 1;
for (int i2 = 0; i2 < map.length; i2++) {
for (int j2 = 0; j2 < map[0].length; j2++) {
if (map[i2][j2] != 0) continue;
map[i2][j2] = 1;
for (int i3 = 0; i3 < map.length; i3++) {
for (int j3 = 0; j3 < map[0].length; j3++) {
if (map[i3][j3] != 0) continue;
map[i3][j3] = 1;
count = Math.max(count, getCount(map, vList));
map[i3][j3] = 0;
}
}
map[i2][j2] = 0;
}
}
map[i1][j1] = 0;
}
}
System.out.println(count);
}
static int getCount(int[][] map, List<String> vList) {
boolean[][] visited = new boolean[map.length][map[0].length];
for (String s : vList) {
int[] arr = Arrays.stream(s.split(" ")).mapToInt(Integer::parseInt).toArray();
dfs(arr[0], arr[1], map, visited);
}
int count = 0;
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
if (map[i][j] == 0 && !visited[i][j]) count++;
}
}
return count;
}
static void dfs(int i, int j, int[][] map, boolean[][] visited) {
visited[i][j] = true;
if (check(i - 1, j, map, visited)) dfs(i - 1, j, map, visited);
if (check(i + 1, j, map, visited)) dfs(i + 1, j, map, visited);
if (check(i, j - 1, map, visited)) dfs(i, j - 1, map, visited);
if (check(i, j + 1, map, visited)) dfs(i, j + 1, map, visited);
}
static boolean check(int i, int j, int[][] map, boolean[][] visited) {
if (i < 0 || i >= map.length) return false;
if (j < 0 || j >= map[0].length) return false;
if (visited[i][j]) return false;
if (map[i][j] == 1) return false;
return map[i][j] != 2;
}
}
조건 생각하다가 머리가 아팠던 문제였다.
'백준' 카테고리의 다른 글
| [JAVA] 백준 17144 - 미세먼지 안녕! (2) | 2025.08.30 |
|---|---|
| [JAVA] 백준 14938 - 서강그라운드 (0) | 2025.08.29 |
| [JAVA] 백준 13172 - Σ (2) | 2025.08.28 |
| [JAVA] 백준 12851 - 숨바꼭질 2 (0) | 2025.08.25 |
| [JAVA] 백준 11404 - 플로이드 (0) | 2025.08.25 |