๐SWEA_SW_1767
๐ [SW_1767] ํ๋ก์ธ์ ์ฐ๊ฒฐํ๊ธฐ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Solution {
static StringTokenizer st;
static int[][] map;
static ArrayList<int[]> list;
static int N, max, totalCnt, min;
static int[] dy = { -1, 1, 0, 0 };
static int[] dx = { 0, 0, -1, 1 };
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// ํ
์ผ
int t = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= t; tc++) {
sb.append("#").append(tc).append(" ");
// ๋ฐฐ์ด ํฌ๊ธฐ
N = Integer.parseInt(br.readLine());
// ์ ์ฒด ์ฝ์ด ๋ฆฌ์คํธ
map = new int[N][N];
// ๊ฐ์ฅ์๋ฆฌ๋ฅผ ์ ์ธํ ์ฝ์ด ๋ฆฌ์คํธ
list = new ArrayList<int[]>();
// ์ต๋ ์ฐ๊ฒฐ ์ฝ์ด์
max = 0;
// ์ต์ ์ ์ ๊ธธ์ด์ ํฉ
min = Integer.MAX_VALUE;
// ๊ฐ์ฅ์๋ฆฌ๊ฐ ์๋ ์ฝ์ด์ ๊ฐ์
totalCnt = 0;
// ์
๋ ฅ
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
// ๊ฐ์ฅ ์๋ฆฌ์ ์๋ ๊ฒ์ ํต๊ณผ ( ์ด์ฐจํผ ์ฐ๊ฒฐ์ด ๋์ด์๊ธฐ ๋๋ฌธ์ ํ์ธํ ํ์ x -> ์๊ฐ๋ณต์ก๋ ๊ฐ์ )
if ((i == 0 || i == N - 1 || j == 0 || j == N - 1) && map[i][j] == 1)
continue;
// ๊ฐ์ฅ ์๋ฆฌ์ ์๋ ์ฝ์ด๊ฐ ์๋๋ฉด list์ ์ถ๊ฐ
if (map[i][j] == 1) {
list.add(new int[] { i, j });
// ๊ฐ์ ์ถ๊ฐ
totalCnt++;
}
}
}
go(0, 0);
sb.append(min).append("\n");
}
System.out.println(sb);
}
// ๋ถ๋ถ์งํฉ์ ์ฝ์ด ์ ์ ๋๊ธฐ ์๋ , cCnt : ์ ์๊ณผ ์ฐ๊ฒฐ๋ ์ฝ์ด ์
private static void go(int index, int cCnt) {
// ๊ธฐ์ ์กฐ๊ฑด - ๋ชจ๋ ์ฝ์ด๋ฅผ ์๋ํด๋ณธ ๊ฒฝ์ฐ
if (index == totalCnt) {
int res = getLength();
// ํ์ฌ ์ฐ๊ฒฐ๋ ์ฝ์ด์๊ฐ ๋ ๋ง๋ค๋ฉด ์ต๋ ์ฝ์ด์์ ์ต์ ์ ์ ๊ธธ์ด ํฉ์ ๋ฐ๊ฟ์ค๋ค.
if (max < cCnt) {
max = cCnt;
min = res;
} else if (max == cCnt) { // ์ต๋ ์ฐ๊ฒฐ ์ฝ์ด์๊ฐ ๊ฐ๋ค๋ฉด ๋ ์ต์์ธ ๊ฒ์ผ๋ก ๋ฐ๊พผ๋ค
if (min > res)
min = res;
}
return;
}
// ์ฒ๋ฆฌํด์ผํ ์ฝ์ด
int[] core = list.get(index);
int y = core[0];
int x = core[1];
// ์ ์ ๋์๋ณด๊ธฐ ( 4๋ฐฉํฅ์ผ๋ก )
for (int i = 0; i < 4; i++) {
// ๋์ ์ ์๋์ง ํ์ธ x,y ์์น์์ i ๋ฐฉํฅ์ผ๋ก ๋์ ์ ์์ผ๋ฉด
if (isAvailable(y, x, i)) {
// ํ์ฌ ์ํ๋ฅผ ๋ณ๊ฒฝ ( ์ ์ ๋๊ธฐ ) -> 0 ์ ๋น์๋ฆฌ 1 ์ ์ฝ์ด ์๋ฆฌ 2 ๋ ์ ์ ์๋ฆฌ
setStatus(y, x, i, 2);
// ๋ค์ core๋ก ์ด๋
go(index + 1, cCnt + 1);
// ์ฒ์์ ์๋ฐฉํฅ์ผ๋ก ๋๊ณ ๋ค ๊ฐ๋ค์์ผ๋ ์ด์ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๋๊ณ ๋ค ๋๊ธฐ ์ํด ๋ค์ ๋น์๋ฆฌ๋ก ๋ง๋ค์ด์ค๋ค. ์ ์ ์ง์ฐ๊ธฐ
// ๋ฐฑํธ๋ํน
setStatus(y, x, i, 0);
}
}
// ์ ์ ๋์ง ์๊ธฐ , ์นด์ดํธ ๋ณํ๋ ์๋ค
go(index + 1, cCnt);
}
// r, c ์์น์์ d ๋ฐฉํฅ์ผ๋ก ์ ์ ์ ๋์ ์ ์๋์ง ์ฒดํฌ
private static boolean isAvailable(int y, int x, int i) {
int nx = x;
int ny = y;
while (true) {
nx += dx[i];
ny += dy[i];
// ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ
if (nx < 0 || nx >= N || ny < 0 || ny >= N)
break;
// ๋ค๋ฅธ ์ฝ์ด๋ ์ ์ ์ ๋ง๋๋ฉด return false ( 1, 2 ์ธ ๊ฒฝ์ฐ )
if(map[ny][nx] >= 1) return false;
}
// ๋ค๋ฅธ์ ๋ค ์๋ง๋๊ณ ๋๊น์ง ๋ค๊ฐ์ ์๋ฃ
return true;
}
// r,c ์์น์์ d ๋ฐฉํฅ์ผ๋ก ์ ์ ์ ๋๊ฑฐ๋(2) ์ง์ฐ๊ฑฐ๋(0) -> s ๋ ์ํ๋ฅผ ๋ํ๋ผ๊ฑฐ์
private static void setStatus(int y, int x, int i, int s) {
int nx = x;
int ny = y;
// ๋ฐฉํฅ ํ์
while (true) {
// ์ฝ์ด์์น๋ ๊ฑด๋ค์ง ์๋๋ค. ํ ๋ฐฉํฅ์ผ๋ก ๊ณ์ ๊ฐ๋ค ( while ๋ฌธ )
nx += dx[i];
ny += dy[i];
// ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ
if (nx < 0 || nx >= N || ny < 0 || ny >= N)
break;
// ์๊ทธ๋ฌ๋ฉด map ์ ์ํ๊ฐ์ผ๋ก ์ฑ์ด๋ค
map[ny][nx] = s;
}
}
// ๋์์ง ์ ์ ์ ๊ธธ์ด์ ํฉ ๊ณ์ฐ
private static int getLength() {
int lCnt = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
// ์ ์ ์ผ ๊ฒฝ์ฐ
if (map[i][j] == 2)
lCnt++;
}
}
return lCnt;
}
}
๐ค ๋์ ์๊ฐ
์ผ๋จ ๋ชจ๋ ๋ฌธ์ฅ์ ์ฃผ์์ ๋ฌ์ ๋ณด์๋ค.
๋จผ์ ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด ๋ถ๋ถ ๋ฌธ์ ๋ค์ด ์๋ค.
- ๊ฐ์ฅ์๋ฆฌ ์ฝ์ด๋ ์ด๋ฏธ ์ฐ๊ฒฐ๋์ด ์๋ ์ํ
- ์ ์ ์ ์ง์ ์ผ๋ก ๋๊ฐ๋ค.
- ์ ์ ๋ผ๋ฆฌ ๊ต์ฐจํ๋ฉด ์๋๋ค.
- ์ต๋ํ ๋ง์ core์ ์ ์์ ์ฐ๊ฒฐํ์์ ๊ฒฝ์ฐ ์ ์ ๊ธธ์ด์ ํฉ์ ๊ตฌํ๋ผ ( ์ฌ๋ฌ ๊ฒฝ์ฐ๊ฐ ๋์ฌ ์ ํฉ์ด ์ต์๊ฐ ๋๋ ๊ฒ )
- 7 <= N <= 12 ์ด๊ณ 1 <= core <= 12 ์ด๋ค. ์ด ์กฐ๊ฑด์ ๊ฐ์ง๊ณ ์๊ฐ๋ณต์ก๋๋ฅผ ์ ์ถํ ์ ์๋ค.
๋จผ์ 1๋ฒ์ ํตํด ๊ฐ์ฅ์๋ฆฌ์ core ๋ค์ ์ฐ๋ฆฌ๊ฐ ๋ง์ง ํ์๊ฐ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋๋ค.
๊ทธ๋์ list์ core์ ์ขํ๋ฅผ ์ ์ฅํ ๋ ๊ฐ์ฅ์๋ฆฌ core ๋ค์ ๋นผ์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ core๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณด๋ฉด core ๊ฐ 5๊ฐ ์ผ ๊ฒฝ์ฐ 5C1, 5C2, 5C3 โฆ 5C5 ์ด๋ ๊ฒ ์งํ๋๋ค. ์ด ๊ณผ์ ์ ๋ค ๋ํ๋ฉด ๊ฒฐ๊ตญ ๋ถ๋ถ์งํฉ์ ๊ตฌํ๋ ๊ตฌ์กฐ์ด๋ค. ๊ทธ๋์ ๋ถ๋ถ์งํฉ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์๊ฐํ๋ค.
์ฌ๊ธฐ์ ์๊ฐ๋ณต์ก๋๋ฅผ ์๊ฐํ๋ฉด ๋ถ๋ถ์งํฉ ๊ตฌํ๋ ๋ฌธ์ ๋ ๋ณดํต O(2โฟ)์ด๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ์,ํ,์ข,์ฐ,๋ฏธํฌํจ ๊น์ง 5๊ฐ์ง ๊ฒฝ์ฐ์ด๊ธฐ ๋๋ฌธ์ O(5โฟ)์ผ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ !! ์ฌ๊ธฐ์ ๊ฐ์ฅ์๋ฆฌ core๋ฅผ ์ ์ธํ๊ณ 3๋ฒ ๋ฌธ์ ์ ๊ฐ์ด ๋์ค์ ์ ์ ๋ค์ด ํ๋ ๋ ์ฉ ๊ทธ์ด๊ณ ๋๋ฉด ๋ชป๊ฐ๊ฒ ๋๋ ๊ฒฝ์ฐ๋ ๋ง์ด ์๊ธธ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ๋๋ต O(4โฟ)์ด๋ผ ์๊ฐํ๋ฉด n์ ์ต๋๊ฐ์ด 12์ด๊ธฐ ๋๋ฌธ์ 4์ 12์น์ ์ถฉ๋ถํ ํด๋ผ ์ ์๋ ์๊ฐ ๋ณต์ก๋์ด๋ค. ์ด ๋ฐฉ๋ฒ์ ํ๋ฆฌ์ง ์์๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ํ ๊ฒ์ ์๊ฐํด๋ณด๋ฉด ๋ถ๋ถ์งํฉ์ผ๋ก ์ฝ์ด ์ ์ ๋๊ธฐ, ์ ์ ๋์์ ์๋์ง ์ฒดํฌ, ๋ฐฐ์ด์ ์ํ ์ ์ฅ, ๋์์ง ์ ์ ๊ธธ์ด์ ํฉ ๋ฉ์๋๊ฐ ํ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ core์์ 4๋ฐฉํฅ ( ์,ํ,์ข,์ฐ )์ผ๋ก ํ์ํ๋ ๊ฒ๋ ๋ฃ์ด์ค๋ค.
์์ธํ ๊ฒ์ ์ฃผ์์๋ค ๋ค ๋ฌ์๋์๋ค.