[BOJ] 2636. 치즈
15 Apr 2026
Reading time ~1 minute
풀이
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static Scanner sc=new Scanner(System.in);
static int N,M;
static int map[][];
static boolean discovered[][];
static int count[];
static int dx[]= {1,0,-1,0};
static int dy[]= {0,1,0,-1};
public static void main(String[] args) {
N=sc.nextInt();
M=sc.nextInt();
map=new int[N][M];
discovered=new boolean[N][M];
int initOne=0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
map[i][j]=sc.nextInt();
if(map[i][j]==1) {
initOne++;
}
}
}
bfs(0,0);
int hour=0;
int preCnt=0;
while(true) {
int cnt=0;
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
if(map[i][j]==1 && check(i,j)) {
map[i][j]=0;
}
}
}
for (int i = 0; i < map.length; i++) {
for(int j = 0; j < map[0].length; j++) {
if(map[i][j]==2) {
map[i][j]=0;
discovered[i][j]=false;
}
if(map[i][j]==1) {
cnt++;
}
}
}
bfs(0,0);
hour++;
if(cnt==0) {
break;
}
preCnt=cnt;
}
if(initOne==0) hour=0;
if(hour==1) preCnt=initOne;
System.out.println(hour);
System.out.println(preCnt);
}
public static void bfs(int x,int y) {
Queue<Point> q=new LinkedList<>();
q.add(new Point(x,y));
discovered[x][y]=true;
map[x][y]=2;
while(!q.isEmpty()) {
Point c=q.poll();
for (int i = 0; i < 4; i++) {
int nx=c.x+dx[i];
int ny=c.y+dy[i];
if(nx<0 || nx>N-1 || ny<0 || ny>M-1) continue;
if(map[nx][ny]==0 && !discovered[nx][ny]) {
discovered[nx][ny]=true;
map[nx][ny]=2;
q.add(new Point(nx,ny));
}
}
}
}
public static void print(int map[][]) {
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
public static boolean check(int x,int y) {
if(map[x+1][y]==2) return true;
if(map[x][y+1]==2) return true;
if(map[x-1][y]==2) return true;
if(map[x][y-1]==2) return true;
return false;
}
static class Point {
int x,y;
Point(int x,int y){
this.x=x;
this.y=y;
}
}
}