BOJ_G4_14502
๐ [G4_14502] ์ฐ๊ตฌ์
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class BOJ_G4_14502 {
public static class Dot {
private int x;
private int y;
public Dot(int y, int x) {
this.x = x;
this.y = y;
}
}
static int N, M;
// 4๋ฐฉํฅ ํ์
static int[] dx = {1, 0, -1, 0};
static int[] dy = {0, 1, 0, -1};
// map
static int[][] map;
static int[][] mapCopy;
// ์ต๋๊ฐ
static int maxValue = 0;
// ๋น ๊ณต๊ฐ List -> ๋ฒฝ ๋ฃ์ ์ ์๋ ๊ณต๊ฐ
static List<Dot> list = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// ๊ฐ๋ก ์ธ๋ก ํฌ๊ธฐ ์
๋ ฅ ๋ฐ๊ธฐ
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[N][M];
mapCopy = new int[N][M];
// map ์
๋ ฅ
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());
// ๋น๊ณต๊ฐ์ด๋ฉด List์ ๋ฃ์ด์ฃผ๊ธฐ
if (map[i][j] == 0) {
list.add(new Dot(i, j));
}
}
}
inputWall(0,0);
System.out.println(maxValue);
}
// ๋ฒฝ ์
๋ ฅํ๊ธฐ xC3
// mapCopy[][] ์ ๋ฒฝ ์
๋ ฅ
static void inputWall(int idx, int cnt) {
// 3๊ฐ ๋ฒฝ ๋ค ๋ฃ์์ ๊ฒฝ์ฐ ๋ฐ์ด๋ฌ์ค ํผ๋จ๋ฆฌ๊ธฐ
// ์ต๋๊ฐ ๊ณ์ฐ
if (idx == 3) {
// ๋ฒฝ ๋ฃ์ map์ mapCopy๋ก ๋ณต์ฌ
copy();
// ๋ฐ์ด๋ฌ์ค ํผ๋จ๋ฆฌ๊ธฐ
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(mapCopy[i][j] == 2) {
dfs(i, j);
}
}
}
// ์์ ์์ญ ํฌ๊ธฐ ๊ตฌํ๊ธฐ
int size = size();
// ์ต๋๊ฐ ๊ฐฑ์
maxValue = Math.max(maxValue, size);
// map ์ด๊ธฐํ
copy();
return;
}
// ๋ฒฝ ๋๊ธฐ
for(int i=cnt; i<list.size();i++){
// ๋ฒฝ์ ๋์ ์ ์๋ x,y ์ขํ
int x = list.get(i).x;
int y = list.get(i).y;
// ๋ฒฝ ๋๊ธฐ
map[y][x] = 1;
inputWall(idx+1, i+1);
// ๋ฒฝ ๋นผ๊ธฐ
map[y][x] = 0;
}
}
// 4๋ฐฉํฅ ํ์์ ํตํด ๋ฐ์ด๋ฌ์ค ํผ๋จ๋ฆฌ๊ธฐ
// 1์ด๊ฑฐ๋ 2์ด๋ฉด ๋ชป๊ฐ๊ฒ -> ์ด์ฐจํผ ์ํ์ด๋ผ ์๊ด x
static void dfs(int y, int x) {
// 4๋ฐฉํฅ ํ์
int nx,ny;
for(int i=0; i<4; i++){
nx = x + dx[i];
ny = y + dy[i];
// ๋ง์ฝ ๋ฒ์๋ฅผ ์ด๊ณผํ ๊ฒฝ์ฐ ํต๊ณผ
if(nx < 0 || ny < 0 || nx >= M || ny >= N) continue;
// ๋ง์ฝ ๋ฒฝ์ด๊ฑฐ๋ ๋ฐ์ด๋ฌ์ค๊ฐ ์ด๋ฏธ ์๋ ๊ณณ์ด๋ฉด ํต๊ณผ
if(mapCopy[ny][nx] == 1 || mapCopy[ny][nx] == 2) continue;
// ๋ฐ์ด๋ฌ์ค ํผ๋จ๋ฆฌ๊ธฐ
mapCopy[ny][nx] = 2;
dfs(ny,nx);
}
}
// ์์ ์์ญ ํฌ๊ธฐ ๊ตฌํ๊ธฐ
static int size() {
int size = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (mapCopy[i][j] == 0) size++;
}
}
return size;
}
// ๋ฐฐ์ด ๋ณต์ฌ
// ๋ฒฝ์ 3๊ฐ ๋ง์๋๋ก ๋๊ณ ๋ฐ์ด๋ฌ์ค ํผ๋จ๋ฆฌ๊ณ ์ต๋๊ฐ ๊ฐฑ์
static void copy() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
mapCopy[i][j] = map[i][j];
}
}
}
}
๐ค ๋์ ์๊ฐ
์ค๋๋ง์ ํธ๋ ๊ณจ๋ ๋ฌธ์ ์๋ค..ใ
ใ
์ฒ์์ ์ฃผ์์ผ๋ก ๋ง๋ค์ด์ผํ๋ ๋ฉ์๋๋ค์ ๋ค ์ ๋ฆฌํด์ฃผ๊ณ ํ๋๋ฐ
๋ฒฝ 3๊ฐ ์
๋ ฅ, dfs๋ก ๋ฐ์ด๋ฌ์ค ํ์ฅ, ์์ ์์ญ ํฌ๊ธฐ ๊ตฌํ๊ธฐ, ๋ฐฐ์ด ๋ณต์ฌ๋ฅผ ์ค๊ณํ๋ค.
๋จผ์ ์์ ์์ญ์ ๋ฒฝ์ 3๊ฐ ๊ณจ๋ผ ์
๋ ฅํ๋ ์ฝ๋ ์์ 3๊ฐ๋ฅผ ๋ค ์
๋ ฅํ๋ฉด ๊ทธ๋ ๋ฐ์ด๋ฌ์ค๋ฅผ ํ์ฅ์ํจ ํ ์์ ์์ญ ํฌ๊ธฐ๋ฅผ ๊ตฌํด์ฃผ์๋ค.
๊ทธ ํฌ๊ธฐ๋ค์ ์ต๋๊ฐ์ ์ถ๋ ฅํด์ฃผ์๋๋ฐ ์ฌ๊ธฐ์ ํฌ์ธํธ๊ฐ ๋ฐ์ด๋ฌ์ค๋ฅผ ํ์ฅ ์ํฌ ๋ ๊ณ์ ๊ฐ์ map์ ์ฌ์ฉํ๋ฉด ๋ณต๊ตฌํ๊ธฐ๊ฐ ์ด๋ ค์์ ๋ฒฝ์ ์ฝ์
ํ๋ ์ฝ๋๋ ๊ธฐ์กด map์ ํด์ฃผ์ง๋ง ๋ฐ์ด๋ฌ์ค๋ฅผ ํ์ฅ์ํค๊ธฐ ์ ์๋ map์ mapCopy์ ๋ณต์ฌ๋ฅผ ํด์ฃผ์ด ๋ฐ์ด๋ฌ์ค ํ์ฅ ๊ณผ์ ์ mapCopy์์ ์งํํด ์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ mapCopy์ ๋ฐฐ์ด์ ํ์ธํ์ฌ ์์ ์์ญ ํฌ๊ธฐ๋ฅผ ๊ตฌํด์ฃผ์๋ค.
๋คํํ ๋ฐฐ์ด ํฌ๊ธฐ๊ฐ ํฌ์ง ์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋จ์ง ์์๋๋ฐ ์์ ํ์ ๋ชฉ์ ์ผ๋ก ๋ธ ๋ฌธ์ ๋ก ์์ํ๋ค.