백준 치즈

KIMYEONGJUN·2026년 3월 19일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에는 사각형 모양 판의 세로와 가로의 길이가 양의 정수로 주어진다.
세로와 가로의 길이는 최대 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;
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글