๋ฌธ์
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRQm6qfL0DFAUo
๋ด ๋ฌธ์ ํ์ด
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;
public class Solution {
static int n, w, h;
static int[][] map, memory;
static boolean[][] visited;
static int[] nums;
static int ans;
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder out = new StringBuilder();
int tc = Integer.parseInt(in.readLine());
for(int t = 1; t <= tc; t++) {
st = new StringTokenizer(in.readLine());
n = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
h = Integer.parseInt(st.nextToken());
map = new int[h][w];
memory = new int[h][w];
for(int i = 0; i < h; i++) {
st = new StringTokenizer(in.readLine());
for(int j = 0; j < w; j++) {
int now = Integer.parseInt(st.nextToken());
map[i][j] = now;
memory[i][j] = now;
}
}
ans = Integer.MAX_VALUE;
makeSet();
makePermu(0, new int[n]);
out.append("#" + t + " " + ans + "\n");
}
System.out.print(out);
}
public static void makeSet() { // 0๋ถํฐ w-1๊น์ง, ๊ตฌ์ฌ์ด ๋จ์ด์ง ์ ์๋ ์์น๋ค์ ๋ด๋ ์งํฉ ๋ง๋ค๊ธฐ
nums = new int[w];
for(int i = 0; i < w; i++) nums[i] = i;
}
public static void makePermu(int nth, int[] choosed) { // ์ค๋ณต ์์ด (๊ตฌ์ฌ์ด ๋จ์ด์ง ์ ์๋ ์์น๋ค์ ๋ชจ๋ ์์ด)
if(nth == choosed.length) {
oneCase(choosed);
return;
}
for(int i = 0; i < nums.length; i++) {
choosed[nth] = nums[i];
makePermu(nth+1, choosed);
}
}
public static void oneCase(int[] choosed) { // ํ๋์ ์์ด์ ๋ํ ์๋ฎฌ๋ ์ด์
for(int i = 0; i < n; i++) {
int y = choosed[i];
for(int x = 0; x < h; x++) {
if(map[x][y] > 0) { // ์ฒซ ๋ฒ์งธ ๋ฒฝ๋์ ๋ง๋ฌ์ ๋
Deque<int[]> que = new ArrayDeque<>();
que.add(new int[]{x, y, map[x][y]});
destroy(que);
fall();
break;
}
}
}
findAns();
initMap();
}
public static void destroy(Deque<int[]> que) { // ํ๋์ ๊ตฌ์ฌ์ ์ํ ๋ฒฝ๋๋ค์ ๋ถ์์ง์ ํํ
visited = new boolean[h][w];
while(!que.isEmpty()) {
int[] now = que.removeFirst();
int x = now[0];
int y = now[1];
int num = now[2];
for(int i = 0; i < h; i++) { // ์, ํ
if(i < x-num+1 || i > x+num-1 || visited[i][y] == true) continue;
que.add(new int[]{i, y, map[i][y]});
map[i][y] = 0;
visited[i][y] = true;
}
for(int i = 0; i < w; i++) { // ์ข, ์ฐ
if(i < y-num+1 || i > y+num-1 || visited[x][i] == true) continue;
que.add(new int[]{x, i, map[x][i]});
map[x][i] = 0;
visited[x][i] = true;
}
}
}
public static void fall() { // ํ๋์ ๊ตฌ์ฌ์ ๋ํ ๋ฒฝ๋ ๋ถ์จ์ด ๋๋๋ฉด, ๋ฒฝ๋ค๋ค์ ์๋๋ก ๋จ์ด๋จ๋ฆฌ๊ธฐ
for(int y = 0; y < w; y++) {
for(int x = h-1; x > 0; x--) { // ๋งจ ์ ์นธ์ ๋น ์นธ์ด์ด๋ ๋จ์ด๋จ๋ฆด ๋ฒฝ๋์ด ์์ผ๋ฏ๋ก, ๋งจ ์์นธ์ ๋ฐ๋ก ์๋ซ์นธ๊น์ง๋ง ํ์
if(map[x][y] == 0) {
for(int a = x-1; a >= 0; a--) {
if(map[a][y] > 0) {
map[x][y] = map[a][y];
map[a][y] = 0;
break;
}
}
}
}
}
}
public static void findAns() { // ๋จ์ ๋ฒฝ๋ ์๋ฅผ ์ธ๊ณ , ์ต์๊ฐ ๊ฐฑ์
int cnt = 0;
for(int i = 0; i < h; i++) {
for(int j = 0; j < w; j++) {
if(map[i][j] > 0) cnt++;
}
}
ans = Math.min(ans, cnt);
}
public static void initMap() { // ํ๋์ ์กฐํฉ์ ๋ํ ์ฐ์ฐ์ ๋๋ด๋ฉด map ๋ฐฐ์ด ๋ค์ ์์๋ณต๊ท
for(int i = 0; i < h; i++) {
System.arraycopy(memory[i], 0, map[i], 0, memory[i].length);
}
}
}
๐ ์๋ฎฌ๋ ์ด์ , ๊ตฌํ + ์์ด, BFS ๋ฌธ์
makePermu ๋ฉ์๋๋ฅผ ํตํด ์ค๋ณต ์์ด์ ๋ง๋ค์ด์ ๊ตฌ์ฌ์ด ๋จ์ด์ง ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๊ณ ,
ํ๋์ ์์ด์ ์์ฑํ ๋๋ง๋ค oneCase ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํด๋น ์์ด์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ๋ค.
oneCase ๋ฉ์๋์์๋ ์์ด์ ์ฃผ์ด์ง ์ด์ ์์์๋ถํฐ ํ์ํ๋ฉฐ
๊ตฌ์ฌ์ ๋์ก์ ๋ ๋ง๋ ์ ์๋ ์ฒซ ๋ฒ์งธ ๋ฒฝ๋์ ์ฐพ์์ฃผ์๊ณ ,
์ฐพ์์ ์์๋ destroy ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ BFS ํ์์ ํตํด ๋ถ์ ์ ์๋ ๋ฒฝ๋์ ์ฐพ์ ๋ถ์๋ค.
destroy ๋ฉ์๋๊ฐ ์ข ๋ฃ๋์์ ๋๋ fall ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ map์ ๋น ์นธ๋ค์ ์ฑ์์ฃผ์๋ค.
map์ ์๋์์๋ถํฐ ํ์ํ๋ฉฐ ๋น ์นธ ๋ฐ๊ฒฌ ์, ์๋ก ํ์ํ์ฌ ์ฐพ์ ๋ฒฝ๋์ ํ๋์ฉ ์ฎ๊ฒจ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค.
ํ๋์ ์์ด์ ๋ํ ๋ชจ๋ ์ฐ์ฐ์ ๋ง์ณค์ ๋๋ ๋ฒฝ๋์ ๊ฐ์๋ฅผ ์ธ์ด์ค ๋ค ์ต์๊ฐ์ ๊ฐฑ์ ํ๊ณ ,
map ๋ฐฐ์ด์ ๋ค์ ์์๋ณต๊ตฌ ํด์ฃผ์ด ๋ค์ ์์ด์ ๋ํ ์ฐ์ฐ์ ์งํํ ์ ์๋๋ก ๋ง๋ค์๋ค.
๐ก ํผ๋๋ฐฑ
- ์ฒ์์ ์๋ชป ์๊ฐํด์ ์ค๋ณต ์์ด์ด ์๋ ์ค๋ณต ์กฐํฉ์ ๊ตฌํ๋ค๊ฐ,, ๋น๋น ๋์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.ใ
ใ
๊ตฌ์ฌ๋ค์ ๊ฐ์ ์์น์ ๋์ง๋๋ผ๋ ์์๊ฐ ๋ฐ๋๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์์ด๋ก!! ํด์ผํ๋ค. - ํจ์จ์ ๋ํ ๋ถ๋ถ์ ๋ณ๋ก ์๊ฐํ์ง ๋ชปํ๊ณ ํ์ดํ๋๋ฐ, ๋ฒฝ๋๋ค์ ๋ถ์ ๋ค ๋น ์นธ์ ์ฑ์ฐ๋ ๊ณผ์ ์์
๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ ๊ฐ๋ค. ๋ค์ ํ ๋ฒ ์๊ฐํด๋ด์ผ๊ฒ ๋ค.
'2๏ธโฃ Java > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java Algorithm] ํ์ ์ด๋ฐฅ BOJ #15961 (1) | 2022.10.11 |
---|---|
[Java Algorithm] ์ค๋์ฟ BOJ #2239 (0) | 2022.10.04 |
[Java Algorithm] RGB ๊ฑฐ๋ฆฌ 2 BOJ #17404 (0) | 2022.10.02 |
[Java Algorithm] ํ์ดํ ์ฎ๊ธฐ๊ธฐ 2 BOJ #17069 (0) | 2022.09.30 |
[Java Algorithm] ํ์ดํ ์ฎ๊ธฐ๊ธฐ 1 BOJ #17070 (2) | 2022.09.30 |
๋๊ธ