๐SWEA_SW_5656
๐ [SW_5656] ๋ฒฝ๋ ๊นจ๊ธฐ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Solution {
static StringTokenizer st;
static int N, W, H, min;
// ์ค๋ฅธ์ชฝ, ์ผ์ชฝ, ์๋, ์
static int[] dr = { 1, -1, 0, 0 };
static int[] dc = { 0, 0, 1, -1 };
static class Point {
int r, c, cnt;
public Point(int r, int c, int cnt) {
super();
this.r = r;
this.c = c;
this.cnt = cnt;
}
}
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(" ");
st = new StringTokenizer(br.readLine(), " ");
// ๊ตฌ์ฌ ๋๋ ํ์
N = Integer.parseInt(st.nextToken());
// ๊ฐ๋ก
W = Integer.parseInt(st.nextToken());
// ์ธ๋ก
H = Integer.parseInt(st.nextToken());
int[][] map = new int[H][W];
for (int i = 0; i < H; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < W; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
min = Integer.MAX_VALUE;
go(0, map);
sb.append(min).append("\n");
}
System.out.println(sb);
}
// ์ค๋ณต์์ด ์ด์ฉํ์ฌ ๊ตฌ์ฌ ๋์ง๊ธฐ
// ๋ฒฝ๋์ด ๋ค ๋ถ์์ก์ผ๋ฉด true, ์๋๋ฉด false
static boolean go(int count, int[][] map) {
// ์ค๋ณต์์ด ๊ตฌ์กฐ
int result = getRemain(map);
// ๋ชจ๋ ๋ฒฝ๋์ด ๋ค ๋ถ์์ก๋ค๋ฉด
if (result == 0) {
min = 0;
return true;
}
// ๋ชจ๋ ๊ตฌ์ฌ์ ๋์ก๋ค๋ฉด
if (count == N) {
min = Math.min(min, result);
return false;
}
int[][] newMap = new int[H][W];
// 0์ด๋ถํฐ W-1์ด๊น์ง ๊ตฌ์ฌ ๋์ ธ๋ณด๊ธฐ
for (int c = 0; c < W; c++) {
// ๊ตฌ์ฌ์ ๋ง๋ ๋ฒฝ๋ ์ฐพ๊ธฐ
int r = 0;
// ๋น๊ณต๊ฐ์ด๋ฉด ๊ณ์ ์๋๋ก
while (r < H && map[r][c] == 0)
++r;
// ํ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋๋ฌ๋ค๋ฉด ํด๋น ์ด์ ๋ฒฝ๋์ด ์์
if (r == H)
continue;
// ๋ฐฐ์ด์ ์ํ๋ฅผ ๋ฐฑ์
copy(map, newMap);
// ํ์ฌ ๋ฒฝ๋ ๊ธฐ์ค์ผ๋ก ์ฃผ๋ณ์ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฒฝ๋ ํจ๊ป ์ฐ์ ์ฒ๋ฆฌ
boom(newMap, r, c);
// ๋ถ์์ง ๋ฒฝ๋ ์ ๋ฆฌ
down(newMap);
// ๋ค์ ๋ฐฐ์ด๋ก ์ถ๋ฐ
// ์ด๋ฏธ ๋๋ฌ๋ค๋ฉด ๋ค์ ๋ ํ์๊ฐ ์๋ค.
if (go(count + 1, newMap)) {
return true;
}
}
// ์์ ๊ตฌ๋ฌธ์์ true ๊ฐ ์๋์ค๋ฉด ๋ค ๋ถ์์ง์ง ์์๋ค๋ ๋ป
return false;
}
// y,x ์์น์์ ์ฃผ๋ณ์ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฒฝ๋๋ ํจ๊ป๋ถ์๋ ์ฒ๋ฆฌ
// BFS
static void boom(int[][] map, int r, int c) {
// BFS
Queue<Point> q = new LinkedList<Point>();
// ๋ฒฝ๋ ํฌ๊ธฐ๊ฐ 2์ด์์ด๋ฉด queue์ ์ฝ์
if (map[r][c] > 1) {
q.offer(new Point(r, c, map[r][c]));
}
map[r][c] = 0; // ์์ ์ ์ ๊ฑฐ ์ฒ๋ฆฌ -> visit ์ฒ๋ฆฌ๋ ๊ฐ์ ์ญํ ์ ํ๋ค
while (!q.isEmpty()) {
Point p = q.poll();
for (int i = 0; i < 4; i++) {
int nr = p.r, nc = p.c;
// ๋ฒฝ๋์ ํฌ๊ธฐ - 1๋งํผ ๋ฐ๋ณต, ๊ณ์ ์์ผ๋ก ๊ฐ๋๊ฑฐ๋ค
for (int j = 1; j < p.cnt; j++) {
nr += dr[i];
nc += dc[i];
if (nr >= 0 && nr < H && nc >= 0 && nc < W) {
if (map[nr][nc] > 1) { // ์ฃผ๋ณ์ ์ํฅ์ ์ฃผ๋ ๋ฒฝ๋์ด๋ฉด
q.offer(new Point(nr, nc, map[nr][nc]));
}
map[nr][nc] = 0; // ๋น๊ณต๊ฐ์ด๋ฉด 0, ๋ฒฝ๋์ด๋ฉด ์ ๊ฑฐ์ฒ๋ฆฌ
}
}
}
}
}
// ๋ถ์์ง ๋ฒฝ๋ ์ ๋ฆฌ, ๋ฐ์ผ๋ก ๋ณด๋ด๊ธฐ !! ( ๊ณต์ค์ ๋ ์๋ ๊ฒ๋ค )
static ArrayList<Integer> list = new ArrayList<Integer>();
static void down(int[][] map) {
// ์ด ๊ณ ์
for (int c = 0; c < W; c++) {
// ๋งจ๋ฐ์นธ๋ถํฐ ์์
int r = H - 1;
while (r > 0) {
if(map[r][c] == 0) {
int nr = r-1;
while(nr>0 && map[nr][c] == 0) nr--;
map[r][c] = map[nr][c];
map[nr][c] = 0;
}
r--;
}
}
}
// ๋จ์ ๋ฒฝ๋ ์ ๊ตฌํ๊ธฐ
static int getRemain(int[][] map) {
int count = 0;
for (int r = 0; r < H; r++) {
for (int c = 0; c < W; c++) {
if (map[r][c] > 0) {
count++;
}
}
}
return count;
}
// ๋ฐฐ์ด ๋ณต์ฌ
static void copy(int[][] map, int[][] newMap) {
for (int r = 0; r < H; r++) {
for (int c = 0; c < W; c++) {
newMap[r][c] = map[r][c];
}
}
}
}
๐ค ๋์ ์๊ฐ
์๋ฎฌ๋ ์ด์
๋ฌธ์ ์ด๋ค.
๊ตฌ์ฌ์ ๋จ์ด๋จ๋ ค ๋ฒฝ๋์ ๊นจ๋๋ฐ ๋ฒฝ๋ ์์ ์๋ ์๋งํผ์ ๋ฒ์๋ก ์ํ์ข์ฐ ๋ ๊นจ์ง๋ค๊ณ ํ๋ค.
๊ทธ๋ฌ๋ฉด ๊ตฌ์ฌ์ ๋จ์ด๋จ๋ฆด ์์น , ๋ฒฝ๋ ์ ๋ฒ์๋งํผ ํญํ, ํญํ๋ ๋น์นธ ์ฑ์ฐ๊ธฐ, ๋จ์ ๋ฒฝ๋ ์ ๊ตฌํ๊ธฐ ๋ฅผ ๊ตฌํํ๋ฉด ๋๋ค.
๊ตฌ์ฌ์ ๋จ์ด๋จ๋ฆด ์์น๋ ์ค๋ณต์์ด์ ์ด์ฉํ์ฌ ๊ตฌํํ๊ณ
๋ฒฝ๋ ์ ๋งํผ ํญํํ๋ ๊ณผ์ ์ BFS๋ฅผ ํ์ฉํ์ฌ ๊ตฌํํด์ผํ๋ค. ์๋ํ๋ฉด ๊ตฌ์ฌ์ ๊ฐ์ ์์น์ ๊ณ์ ๋์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํญํ๋ ๋ค 0์ด ๋ ๋ฒฝ๋๋ค์ ์์ด์ง๋ฏ๋ก ๊ทธ ๋น์นธ์ ์ฑ์ฐ๊ธฐ ์ํด ํ์ ๋งจ ๋ฐ๋ถํฐ ์๋ก ์ฌ๋ผ์ค๋ฉด์ ์ฒดํฌ๋ฅผ ํ๊ณ ์๋ฅผ ๋ฐ๊ฟ์ค๋ค.
์ด ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ์ต๋ํ ๋ง์ ๋ฒฝ๋์ ์ ๊ฑฐํ์ ๋ ๋จ์ ๋ฒฝ๋ ์๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.