Tags
- Study
- ์ ๋ ฌ
- queue
- BOJ
- CodingTest
- SpringBoot
- Java
- greedy
- ๊น์ด ์ฐ์ ํ์
- ๋ฐฑํธ๋ํน
- Brute Force Algorithm
- Dynamic Programming
- ๊ทธ๋ํ ์ด๋ก
- ๊ต์ฌ
- ์ ์๋ก
- ์ํ
- DP
- LV2
- BFS
- ์๋ฃ๊ตฌ์กฐ
- ๋ฌธ์์ด
- PGM
- ๊ทธ๋ํ ํ์
- ๋๋น ์ฐ์ ํ์
- sort
- dfs
- Python
- stack
- ๊ตฌํ
- ์๋ฎฌ๋ ์ด์
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_14502 : ์ฐ๊ตฌ์ ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- N x M ์ฐ๊ตฌ์ ๊ฒฉ์ ๋งต์ ๋น ์นธ์ 0, ๋ฒฝ์ 1, ๋ฐ์ด๋ฌ์ค๋ 2๋ก ์
๋ ฅ๋๋ค.
- ๋ฐ์ด๋ฌ์ค๋ ์ํ์ข์ฐ ์ธ์ ํ ๋น ์นธ์ผ๋ก ํผ์ ธ๋๊ฐ๋ค.
- ๋ฒฝ์ 3๊ฐ ์ธ์์ ๋ฐ์ด๋ฌ์ค๊ฐ ๋ค ํผ์ง ํ ๋์ฌ ์ ์๋ ๋น ์นธ์ ์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
- 3๊ฐ์ ๋ฒฝ์ ์ค์นํ ์์น๋ฅผ ์กฐํฉ์ผ๋ก ๊ตฌํ๋ค.
- BFS๋ก ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง ์ํ๋ก ๋ง๋ ๋ค.
- 0์ ์๋ฅผ ์ธ์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ธ ์ฝ๋ ๐ธ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
private static class Point {
int r, c;
public Point(int r, int c) {
this.r = r;
this.c = c;
}
}
private static int N, M, ans, cnt = -3;
private static int[][] map, copy;
private static Queue<Point> temp;
private static ArrayList<Point> virus;
private static int[] dr = {-1, 0, 1, 0};
private static int[] dc = {0, 1, 0, -1};
public static void main(String[] args) throws IOException {
// Input
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];
copy = new int[N][M];
virus = new ArrayList<>();
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());
if (map[i][j] == 2)
virus.add(new Point(i, j));
else if (map[i][j] == 0)
cnt++;
}
}
// Combination
comb(0, 0);
// Output
System.out.println(ans);
}
private static void comb(int cnt, int now) {
if (cnt == 3) {
ans = Math.max(ans, bfs());
return;
}
for (int i = now; i < N * M; i++) {
int r = i / M;
int c = i % M;
if (map[r][c] == 0) {
map[r][c] = 1;
comb(cnt + 1, i + 1);
map[r][c] = 0;
}
}
}
private static int bfs() {
deepCopy();
temp = new ArrayDeque<>();
for (Point p : virus) {
temp.offer(p);
}
int add_virus = 0;
while (!temp.isEmpty()) {
Point point = temp.poll();
for (int i = 0; i < dr.length; i++) {
int r = point.r + dr[i];
int c = point.c + dc[i];
if (0<=r&&r<N&&0<=c&&c<M&©[r][c] == 0) {
copy[r][c] =2;
add_virus++;
temp.offer(new Point(r,c));
}
}
}
return cnt-add_virus;
}
private static void deepCopy() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
copy[i][j] = map[i][j];
}
}
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- 2์ฐจ์ ๋ฐฐ์ด์ ์ขํ๋ฅผ ๊ธฐ์ตํ๊ฐ ์ํด Point ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
- N x M ์ฐ๊ตฌ์ค ์
๋ ฅ๊ฐ์ 2์ฐจ์ ๋ฐฐ์ด map์ ์ ์ฅํ๋ค.
- ๋ฐ์ด๋ฌ์ค์ ์ด๊ธฐ ์์น๋ฅผ ArrayListํ์ virus์ ์ ์ฅํ๋ค.
- ๋น ์นธ 0์ ์ด ๊ฐ์ cnt๋ ์ฒดํฌํด๋๋ค.
- comb() ๋ฉ์๋์์ ์ธ ๋ฒฝ์ ์์น๋ฅผ ์กฐํฉ์ผ๋ก ์ ํํ๋ค.
- now ๋ณ์๋ฅผ 1์ฉ ์ฆ๊ฐํ๋ฉฐ ๋ชซ๊ณผ ๋๋จธ์ง๋ฅผ 2์ฐจ์ ๋ฐฐ์ด์ ํ๊ณผ ์ด์ ์ฌ์ฉํ๋ค.
- map์ ๋ฒฝ์ ์ธ์ฐ๋ ์ขํ์ 1์ ๋ฃ๊ณ comb๋ฅผ ์ฌ๊ท ํธ์ถํ๋ค.
- ์ฌ๊ท ํธ์ถ ํ์๋ ๋ค์ 0์ ๋ฃ์ด ์์๋ณต๊ตฌํ๋ค.
- ์ธ์ด ๋ฒฝ์ ๊ฐ์ cnt๊ฐ 3์ด ๋๋ฉด bfs() ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , 0์ ์ต๋๊ฐ ans๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
- bfs() ๋ฉ์๋์์ ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๋๊ฑธ ๊ตฌํํ๊ณ 0์ ๊ฐ์๋ฅผ ์นด์ดํธํด ๋ฐํํ๋ค.
- deepCopy()๋ฉ์๋๋ก ํ์ฌ map์ ์ํ๋ฅผ copy ๋ฐฐ์ด์ ๋ณต์ฌํ๋ค.
- ํ temp์ ๋ฐ์ด๋ฌ์ค 2์ ์์น๋ค์ ๋ฃ๋๋ค.
- ํ temp๊ฐ ๋น ๋ ๊น์ง ๊ณ์ฐ์ ๋ฐ๋ณตํ๊ณ , ๋ฐ์ด๋ฌ์ค์ ์(์ฌ๋ผ์ง 0์ ์)๋ฅผ ์ฒดํฌํ๋ค.
- ํ์ ๊ฐ์ ๊บผ๋ด ์ธ์ ํ ์ํ์ข์ฐ๋ฅผ ํ์ธํ๊ณ ๋น ์นธ์ด๋ผ๋ฉด 0์ผ๋ก ๊ฐ์ ๋ฐ๊พผ ๋ค ํด๋น ์ขํ๋ฅผ ํ์ ๋ฃ๋๋ค.
- cnt์์ add-virus๋ฅผ ๋บ ๊ฐ์ ๋ฐํํ๋ค.
๐ธ end ๐ธ
- ์กฐํฉ๊ณผ BFS๋ฅผ ํจ๊ป ๊ตฌํํ๋ ๋ฌธ์ ์๋ค.
- comb() ๋ฉ์๋์์ ํจ์จ์ฑ์ ๋์ด๊ณ ์ for๋ฌธ ์กฐ๊ฑด์ ์๋ชป ์ง์ ํด์ 1ํ ํ๋ ธ๋ค.
- ์กฐ๊ธ ์ค๋ณต์ด ์ผ์ด๋๋๋ผ๋ ๋ฐ๋ก๊ฐ ์๋ ํ์คํ ์กฐ๊ฑด์ด ๋ ๋์ ๊ฒ ๊ฐ๋ค.
728x90
'CodingTest > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ_5430 : AC (0) | 2023.03.28 |
---|---|
BOJ_9019 : DSLR (0) | 2023.03.21 |
BOJ_1916 : ์ต์๋น์ฉ ๊ตฌํ๊ธฐ (0) | 2023.03.08 |
BOJ_1717 : ์งํฉ์ ํํ (0) | 2023.03.08 |
BOJ_1926 : ๊ทธ๋ฆผ (0) | 2023.03.05 |