알고리즘 공부/문제 풀이
[JAVA] 백준 2638 치즈
valid_ming
2021. 10. 7. 22:05
https://www.acmicpc.net/problem/2638
2638번: 치즈
첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로
www.acmicpc.net



import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
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];
int cnt = 0;
for(int i=0;i<N;i++){
st = new StringTokenizer(br.readLine());
for(int j=0;j<M;j++){
int val = Integer.parseInt(st.nextToken());
map[i][j] = val;
if(val==1) cnt++;
}
}
if(cnt==0){
System.out.println(0);
System.exit(0);
}
int time = 0;
while(true){
boolean melt = false;
visit = new boolean[N][M];
time++;
dfs(0, 0);
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
if(map[i][j]>=3){
melt = true;
map[i][j] = 0;
}
if(map[i][j]==2) map[i][j] = 1;
}
}
if(!melt) break;
}
System.out.println(time-1);
}
static int N, M;
static int[][] map, d={{-1, 1, 0, 0}, {0, 0, -1, 1}};
static boolean[][] visit;
public static void dfs(int r, int c){
visit[r][c] = true;
for(int i=0;i<4;i++){
int nr = r + d[0][i];
int nc = c + d[1][i];
if(0<=nr && nr<N && 0<=nc && nc<M){
if(map[nr][nc]>0) map[nr][nc] ++;
if(!visit[nr][nc] && map[nr][nc]==0) dfs(nr, nc);
}
}
}
}