

내가 생각했을때 문제에서 원하는부분
첫째 줄에는 사각형 모양 판의 세로와 가로의 길이가 양의 정수로 주어진다.
세로와 가로의 길이는 최대 100이다.
판의 각 가로줄의 모양이 윗 줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.
치즈가 없는 칸은 0, 치즈가 있는 칸은 1로 주어지며 각 숫자 사이에는 빈칸이 하나씩 있다.
첫째 줄에는 치즈가 모두 녹아서 없어지는 데 걸리는 시간을 출력하고, 둘째 줄에는 모두 녹기 한 시간 전에 남아있는 치즈조각이 놓여 있는 칸의 개수를 출력한다.
내가 이 문제를 보고 생각해본 부분
먼저 판의 크기와 상태를 입력받아 2차원 배열 board에 저장한다.
time 변수는 치즈가 녹은 시간을 저장하며, lastCheeseCount는 마지막으로 녹기 전 남은 치즈 칸 수를 기록한다.
bfsAir 함수는 공기 영역을 방문 표시하는 BFS 탐색이다.
외부 공기는 (0,0)에서 시작하여 치즈가 없는 칸(0)만 방문한다.
meltCheese 함수는 각 치즈 칸이 외부 공기와 맞닿아 있는지 확인해, 맞닿으면 녹일 칸으로 표시한다.
그리고 해당 칸들을 0으로 바꿔 녹이다.
while 반복문은 더 이상 녹일 치즈가 없을 때까지 반복하며, 녹인 치즈 개수를 저장하고 시간이 흐른다.
마지막에 녹을 때까지 걸린 시간과 녹기 바로 전 치즈 칸 개수를 출력한다.
코드로 구현
package baekjoon.baekjoon_33;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
// 백준 2636번 문제
public class Main1331 {
static int N, M;
static int[][] board;
static boolean[][] visited;
// 방향 벡터: 상, 하, 좌, 우
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
board = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
int time = 0;
int lastCheeseCount = 0;
while (true) {
visited = new boolean[N][M];
bfsAir();
int melted = meltCheese();
if (melted == 0)
break; // 녹는 치즈가 없으면 종료
lastCheeseCount = melted;
time++;
}
System.out.println(time);
System.out.println(lastCheeseCount);
br.close();
}
// 외부 공기를 표시하기 위한 BFS (0,0에서 시작)
static void bfsAir() {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{0, 0});
visited[0][0] = true;
while (!queue.isEmpty()) {
int[] cur = queue.poll();
int x = cur[0];
int y = cur[1];
for (int dir = 0; dir < 4; dir++) {
int nx = x + dx[dir];
int ny = y + dy[dir];
if (nx >= 0 && nx < N && ny >= 0 && ny < M) {
// 치즈가 아니고 공기이며 방문하지 않은 곳
if (!visited[nx][ny] && board[nx][ny] == 0) {
visited[nx][ny] = true;
queue.add(new int[]{nx, ny});
}
}
}
}
}
// 외부 공기와 접촉하는 치즈 칸 녹이기
static int meltCheese() {
int count = 0;
// 녹일 위치 표시 배열
boolean[][] toMelt = new boolean[N][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (board[i][j] == 1) {
// 치즈 주변에 외부 공기(visited가 true인 0)가 있는지 체크
for (int dir = 0; dir < 4; dir++) {
int nx = i + dx[dir];
int ny = j + dy[dir];
if (nx >= 0 && nx < N && ny >= 0 && ny < M) {
if (board[nx][ny] == 0 && visited[nx][ny]) {
toMelt[i][j] = true;
break;
}
}
}
}
}
}
// 녹이기
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (toMelt[i][j]) {
board[i][j] = 0;
count++;
}
}
}
return count;
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.