[๋ฐฑ์ค] 14502 ์ฐ๊ตฌ์
https://www.acmicpc.net/problem/14502
๋ฌธ์ ์ ๊ทผ
๋ชจ๋ ๋งต์ ๋๋ฉด์ ๋ฒฝ์ 3๊ฐ ์ธ์ธ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ํ์ํด์ผํ๋ค.
์ฌ๊ทํจ์๋ฅผ ์ด์ฉํด์ ๋ฒฝ์ ์ธ์ธ ์ ์๋ ์ง์ ์์ ๋ฒฝ์ ์ธ์ฐ๋ ๊ฒฝ์ฐ์ ์ธ์ฐ์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ํ์ํ๋ค.
ํฌ๊ฒ๋ณด๋ฉด ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ๋ค,
1.๋ฒฝ์ 3๊ฐ ์ธ์ด๋ค
2.๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ ค ๋ณธ๋ค.
3.์์ ์์ญ์ ์ผ๋ค.
4.์ด๋ฒ ๊ฒฝ์ฐ๊ฐ ์ต๋ ์์ ์์ญ์ธ์ง ํ์ธํ๋ค.
5.1~4๋ฅผ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ค.
Code
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class BOJ14502 {
static int n,m;
static int[][] map;
static int maxCnt = 0;
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1};
static class XY {
int x;
int y;
XY(int x, int y){
this.x = x;
this.y = y;
}
}
/**
* ๋ฒฝ์ ์ธ์ฐ๋ ํจ์
* 1. ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํด์ map์ด 0์ธ ๊ณณ์์ ๋ฒฝ์ ์ธ์ฐ๋ ๊ฒฝ์ฐ์ ์์ธ์ฐ๋ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ํ์ํ๋๋ก ํ๋ค.
* 2. ์ธ์ด ๋ฒฝ์ด 3๊ฐ๊ฐ ๋๋ค๋ฉด ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆฌ๊ณ ์์ ์์ญ์ ์นด์ดํธํ๋ค.
* 3. ๋ ๋ง์ ์์ ์์ญ์ ์ ์ฅํ๋ค.
*/
public static void setWall(int cnt){
if(cnt == 3){
int safeCnt = spreadVirus();
maxCnt = Math.max(maxCnt, safeCnt);
} else {
for(int i = 0; i<n; i++){
for(int j = 0; j<m; j++){
if(map[i][j] == 0){
// ๋ฒฝ์ ์ธ์ฐ๋ ๊ฒฝ์ฐ
map[i][j] = 1;
setWall(cnt + 1);
// ๋ฒฝ์ ์ธ์ฐ์ง ์๋ ๊ฒฝ์ฐ
map[i][j] = 0;
}
}
}
}
}
/**
* ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆฌ๋ ํจ์
* bfs๋ฅผ ์ด์ฉํด์ ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆฐ๋ค.
* ํ์ ๋ฐ์ด๋ฌ์ค๊ฐ ์กด์ฌํ๊ณ ๋ฐฉ๋ฌธํ์ง ์์ ์ง์ ์ ์ ์ฅํ๊ณ ,
* ํด๋น ์ง์ ์์ ์ํ์ข์ฐ๋ก ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆด์ ์๋ ์์ ์์ญ์ ํ์ํ๊ณ ,
* ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆฐ๋ค.
* ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆด ์ ์๋ ๋ชจ๋ ์์ญ์ ํผ๋จ๋ฆฌ๊ณ ์์ ์์ญ์ ์นด์ดํธํ๊ณ ๋ฆฌํดํด์ค๋ค.
*/
public static int spreadVirus(){
Queue<XY> q = new LinkedList<>();
int[][] visited = new int[n][m]; // ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด
int[][] tempMap = new int[n][m]; // ๊ธฐ์กด ๋งต์ ๋ณต์ฌํ๋ ๋ฐฐ์ด
// ๋งต์ ๋ณต์ฌํ๋ค.
for(int i = 0; i<n; i++)
for(int j = 0; j<m; j++)
tempMap[i][j] = map[i][j];
for(int i = 0; i<n; i++){
for(int j = 0; j<m; j++){
// ๋ชจ๋ map์ ๋๋ฉด์ ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆฐ๋ค.
if(tempMap[i][j] == 2 && visited[i][j] == 0){
// ๋ฐ์ด๋ฌ์ค๊ฐ ์๊ณ ๋ฐฉ๋ฌธํ์ง ์์ ์ง์ญ์ ๋ฐฉ๋ฌธํ๋ค.
q.add(new XY(i,j));
while(!q.isEmpty()){
XY cur = q.poll();
visited[cur.x][cur.y] = 1;
for(int k = 0; k<4; k++){
// ์ํ์ข์ฐ๋ก ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆด ์ ์๋์ง ํ์ธ ํ, ํผ๋จ๋ฆด ์ ์๋ค๋ฉด ํผ๋จ๋ฆฐ๋ค.
int next_x = cur.x + dx[k];
int next_y = cur.y + dy[k];
if(!isIn(next_x,next_y)) continue;
if(tempMap[next_x][next_y] != 0 || visited[next_x][next_y] == 1) continue;
q.add(new XY(next_x,next_y));
tempMap[next_x][next_y] = 2;
}
}
}
}
}
return countSafe(tempMap);
}
/**
* ์์ ์์ญ์ ์นด์ดํธ ํ๋ค.
* ๋งต์ ๋๋ฉด์ ์์ ์์ญ์ ์นด์ดํธํ๊ณ ๋ฐํํ๋ค.
*/
public static int countSafe(int[][] map) {
int cnt = 0;
for(int i = 0; i<n; i++) {
for (int j = 0; j < m; j++) {
if(map[i][j] == 0) cnt++;
}
}
return cnt;
}
/**
* map์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋์ง ํ์ธํ๋ ํจ์
*/
public static boolean isIn(int x, int y){
if(x >= 0 && x < n && y >= 0 && y < m) return true;
else return false;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
n = Integer.parseInt(input[0]);
m = Integer.parseInt(input[1]);
map = new int[n][m];
for(int i = 0; i<n; i++){
input = br.readLine().split(" ");
for(int j = 0; j<m; j++){
map[i][j] = Integer.parseInt(input[j]);
}
}
setWall(0);
System.out.println(maxCnt);
}
}
์ด๋ ค์ ๋ ์ / ๋ฐฐ์ด ์ / ๋๋ ์
๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๊ธฐ ์ํด์ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์์ง๋ ์ฌ๊ทํจ์๋ ๋๋ฌด ์ ๊ธฐ?ํ๋ค.
// ๋ฒฝ์ ์ธ์ฐ๋ ๊ฒฝ์ฐ
map[i][j] = 1;
setWall(cnt + 1);
// ๋ฒฝ์ ์ธ์ฐ์ง ์๋ ๊ฒฝ์ฐ
map[i][j] = 0;
ํด๋น ์ฝ๋๋ฅผ ๋ณด๋ฉด map[i][j] = 1(๋ฒฝ์ ์ธ์ด ์ํ)์ด ๋๊ณ cnt+1๋์ฑ๋ก setWallํจ์ ์ฒ์๋ถํฐ ์คํ๋๊ฒ ๋๊ณ , ๊ธฐ์กด ์งํ๋๊ณ ์๋ setWallํจ์๋ cnt๊ฐ ๊ทธ๋๋ก์ธ ์ํ๋ก map[i][j] = 0 (๋ฒฝ์ ์ธ์ฐ์ง ์์ ์ํ)๋ก ๋ค์ ์ง์ญ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ค.
์ด๋ฌํ ์์ผ๋ก ๋ฒฝ์ 3๊ฐ ์ธ์ฐ๋ ๋ชจ๋ ๊ฒฝ์ฐ์์๋ฅผ ํ์ํ ์ ์๊ฒ ๋๋๊ฒ์ด๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm/Java][๋ฐฑ์ค] 6603 ๋ก๋ (0) | 2022.03.21 |
---|---|
[Algorithm/Java][ํ๋ก๊ทธ๋๋จธ์ค] ํ๋ฆฐํฐ (0) | 2022.03.05 |
[Algorithm/Java][ํ๋ก๊ทธ๋๋จธ์ค] ๋ ๋งต๊ฒ (0) | 2022.02.26 |
[Algorithm/Java][ํ๋ก๊ทธ๋๋จธ์ค] ๊ธฐ๋ฅ๊ฐ๋ฐ (0) | 2022.02.18 |
[Algorithm/Java][ํ๋ก๊ทธ๋๋จธ์ค] ์นด์นด์คํ๋ ์ฆ ์ปฌ๋ฌ๋ง๋ถ (0) | 2022.02.17 |