https://www.acmicpc.net/problem/14502
14502๋ฒ: ์ฐ๊ตฌ์
์ธ์ฒด์ ์น๋ช ์ ์ธ ๋ฐ์ด๋ฌ์ค๋ฅผ ์ฐ๊ตฌํ๋ ์ฐ๊ตฌ์์์ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ์ถ๋์๋ค. ๋คํํ ๋ฐ์ด๋ฌ์ค๋ ์์ง ํผ์ง์ง ์์๊ณ , ๋ฐ์ด๋ฌ์ค์ ํ์ฐ์ ๋ง๊ธฐ ์ํด์ ์ฐ๊ตฌ์์ ๋ฒฝ์ ์ธ์ฐ๋ ค๊ณ ํ๋ค. ์ฐ๊ตฌ์๋ ํฌ๊ธฐ๊ฐ N×M์ธ ์ง์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, ์ง์ฌ๊ฐํ์ 1×1 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ์ฐ๊ตฌ์๋ ๋น ์นธ, ๋ฒฝ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ๋ฒฝ์ ์นธ ํ๋๋ฅผ ๊ฐ๋ ์ฐจ์งํ๋ค. ์ผ๋ถ ์นธ์ ๋ฐ์ด๋ฌ์ค๊ฐ ์กด์ฌํ๋ฉฐ, ์ด ๋ฐ์ด๋ฌ์ค๋ ์ํ์ข์ฐ๋ก ์ธ์ ํ ๋น ์นธ์ผ๋ก ๋ชจ๋ ํผ์ ธ๋๊ฐ ์ ์๋ค.
www.acmicpc.net
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
class Point{
int x;
int y;
Point(int x, int y){
this.x = x;
this.y = y;
}
}
public class Main {
public static int N, M; // ์ง๋ ํฌ๊ธฐ
public static int map[][]; // ์ง๋
public static int virusMap[][]; // ์ง๋ ๋ณต์ฌ๋ณธ
public static int max = 0; // ์ต๋ ์์ญ๊ฐฏ์
public static int[] dx = {0, -1, 0, 1}; // ๋๋ถ๋จ์ ๋ฐฉํฅ
public static int[] dy = {-1, 0, 1, 0};
/* ์์ ํ์ + ๋ฐฑํธ๋ํน์ผ๋ก ๋ฒฝ 3๊ฐ ์ธ์ฐ๊ธฐ */
public static void dfs(int count) {
if(count == 3) { // ๊ธฐ์ ์ฌ๋ก: ๋ฒฝ 3๊ฐ ์ธ์ ์๊ฒฝ์ฐ
bfs();
return;
}
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
if(map[i][j] == 0) { // ๋น๊ณต๊ฐ
map[i][j] = 1; // ๋ฒฝ์ผ๋ก ์ธ์ฐ๊ธฐ
dfs(count+1); // dfs๋ก ๋ฒฝ 3๊ฐ๋ฅผ ์ธ์ธ๋๊น์ง ๋ฐ๋ณต
map[i][j] = 0; // ๋ฐฑํธ๋ํน์ผ๋ก ์ธ์ด ๋ฒฝ ํ๋ฌผ๊ธฐ
}
}
}
}
/* ๋น ์นธ(0)์ธ ๊ณณ์ ๋ฐ์ด๋ฌ์ค(2) ์ฑ์ฐ๊ธฐ */
public static void bfs() {
virusMap = new int[N][M];
// ์ด์ ์ map ๋ณต์ฌํ๊ธฐ
for(int i=0; i<N; i++)
for(int j=0; j<M; j++)
virusMap[i][j] = map[i][j];
Queue<Point> q = new LinkedList<>();
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
if(virusMap[i][j] == 2) {
q.add(new Point(i, j));
}
}
}
while(!q.isEmpty()) {
Point p = q.poll();
int x = p.x;
int y = p.y;
for(int i=0; i<4; i++) { // ๋๋ถ์๋จ 4๋ฐฉํฅ ํ์
int nx = x + dx[i];
int ny = y + dy[i];
if(nx>=0 && ny>=0 && nx<N && ny<M) { // map์ ๋ฒ์
if(virusMap[nx][ny] == 0) { // ๋น๊ณต๊ฐ -> ๋ฐ์ด๋ฌ์ค๋ก ํผ๋จ๋ฆฐ๋ค.
virusMap[nx][ny] = 2;
q.add(new Point(nx, ny));
}
}
}
}
max = checkVirusCount();
}
/* ์์ ์์ญ์ ๊ฐฏ์ ๊ตฌํ๊ธฐ */
public static int checkVirusCount() {
int cnt = 0;
for(int i=0; i<N; i++)
for(int j=0; j<M; j++)
if(virusMap[i][j] == 0)
cnt ++;
return Math.max(max, cnt);
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[N][M];
for(int i=0; i<N; i++) {
st = new StringTokenizer(bf.readLine());
for(int j=0; j<M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
if(map[i][j] == 0) {
map[i][j] = 1;
dfs(1);
map[i][j] = 0;
}
}
}
System.out.println(max);
bf.close();
}
}
ํ์ด
dfs + bfs + ์์ ํ์ + ๋ฐฑํธ๋ํน์ผ๋ก ํธ๋ ๋ฌธ์ ๋ค...
๋ฌธ์ ๊ฐ ๋๋ฌด ์ด๋ ค์์ ๋ค๋ฅธ ๋ธ๋ก๊ทธ๋ค์ ์ฐธ๊ณ ํ๋ค.. ๊ฑฐ์ ๊ตฌ๊ธ์ Java ๊ด๋ จ ํฌ์คํ ์ ๋ค ๋ณธ ๊ฒ ๊ฐ๋ค.
๋ฌธ์ ํด๊ฒฐ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
1) ์์ ํ์์ ํตํด map์ ๋ชจ๋ ๊ณณ์ ๋ฒฝ์ 3๊ฐ๋ฅผ ์ธ์ด๋ค.
2) ๋ฒฝ์ด 3๊ฐ๊ฐ ์ธ์์ก์ผ๋ฉด, ์ด์ map์ ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆด ์ ์๋๊ณณ์ ๋ชจ๋ ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆฐ๋ค.
3) ์ ๊ณผ์ ์ด ๋๋๋ฉด, ์์ ์์ญ์ ๊ฐฏ์๋ฅผ ๊ตฌํ๊ณ , ์ต๋ ๊ฐฏ์์ธ์ง ๋น๊ตํ๋ค.
ํ์ด๋ ๊ฐ๋จํ๋ฐ ์์ง bfs๋ ๋ฐฑํธ๋ํน์ ๋ํ ์ดํด๊ฐ ์์ ํ์ง๊ฐ ์์์ ์ดํดํ๋๋ฐ ํ๋ค์๋ค.
์ด์ ์ ์ฌ์ฉ๋ map์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋งต์ด ๊ฒน์น๊ณ ์ค๋ณต๋๊ธฐ๋๋ฌธ์ ๋ฐ์ด๋ฌ์ค๋ก ์ฑ์ธ๋๋ map์ ์๋ก ์ ์ธํด์ผํ๋ค.
dfs๋ ๋ฐฑํธ๋ํน์ ํ์คํ ์ฌ์ฉ๋๋ ๋ก์ง์ ๋น์ท๋น์ท ํ ๊ฒ ๊ฐ๋ค.
์ข ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์ดํดํ๊ณ ๊ฐ์ ์ตํ๋๊ฒ ์ค์ํ ๊ฒ ๊ฐ๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2246๋ฒ: ์ฝ๋ ์ ์ (๊ตฌํ) (0) | 2020.04.09 |
---|---|
[Codeforces] 1080A: Petya and Origami (0) | 2020.04.09 |
[๋ฐฑ์ค] 1188๋ฒ: ์์ํ๋ก ๊ฐ(๊ตฌํ, ์ต๋๊ณต์ฝ์) (0) | 2020.04.08 |
[Codeforces] 1316A: Grade Allocation (0) | 2020.04.07 |
[๋ฐฑ์ค] 10709๋ฒ: ๊ธฐ์์บ์คํฐ(๊ตฌํ) (0) | 2020.04.07 |
๋๊ธ