이 험난한 세상에서어어~

백준 2638, 치즈(java) 본문

algorithm/코딩 테스트

백준 2638, 치즈(java)

토끼띠NJW 2023. 10. 6. 07:41

문제 설명

치즈(2636) 문제에서 공기와 면을 두 개 이상 맞닿고 있는 치즈만 녹이는 것이다.

https://www.acmicpc.net/problem/2638

 

2638번: 치즈

첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로

www.acmicpc.net

문제 풀이

해당 문제의 풀이를 보기에 앞에 골드 4 레벨의 치즈 문제(백준, 2636)를 한 번 풀고 오는 것을 추천한다.

https://www.acmicpc.net/problem/2636

 

2636번: 치즈

아래 <그림 1>과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(<그림 1>에서 네모 칸에 X친 부분)에는 치즈가 놓

www.acmicpc.net

https://jiwonna52.tistory.com/96

 

백준 2636, 치즈(java)

문제 설명 nxm 칸에 구멍이 있는 치즈가 하나 놓여 있다. 공기와 닿은 칸이 1시간 지나면 녹게 되는데, 치즈의 구멍에는 칸이 없지만 구멍이 열리면 구멍 속으로 공기가 들어가게 된다. 이때 치즈

jiwonna52.tistory.com

 

이번 문제는 공기와 접한 면이 2개 이상일 때만 치즈가 녹는 경우이다. 그러므로 공기를 기준으로 너비 우선 탐색을 하되 치즈를 만나면 해당 치즈가 공기와 맞닿는 면이 존재한다는 의미로 count 배열에 값을 하나 올려준다. 그리고 치즈가 녹는 기준은 공기와 맞닿은 면이 2개 이상일 때다.

 

위의 부분만 구현해준다면 쉽게 문제를 풀 수 있을 것이다.

import java.util.*;
import java.io.*;

class Pair {
    int r;
    int c;

    Pair(int r, int c) {
        this.r = r;
        this.c = c;
    }
}

public class Main {
    public static int n, m;
    public static int[][] map;
    public static int[] dR = {-1, 0, 1, 0};
    public static int[] dC = {0, 1, 0, -1};

    // 빈칸을 기준으로 처음 만나는 치즈가 외벽이다.
    public static void bfs() {
        Queue<Pair> queue = new LinkedList<>();
        queue.add(new Pair(0, 0));
        boolean[][] visit = new boolean[n][m];
        int[][] count = new int[n][m];

        while(!queue.isEmpty()) {
            Pair current = queue.poll();
            int cR = current.r;
            int cC = current.c;

            for (int i=0; i<4; i++) {
                int nR = cR + dR[i];
                int nC = cC + dC[i];

                if (nR >= 0 && nR < n && nC >= 0 && nC < m) {
                    if (!visit[nR][nC]) {
                        if (map[nR][nC] == 0) {
                            visit[nR][nC] = true;
                            queue.add(new Pair(nR, nC));
                        } else {
                            count[nR][nC] += 1;
                        }
                    }
                }
            }
        }

        melt(count);
    }

    public static void melt(int[][] count) {
        for (int i=0; i<n; i++) {
            for (int j=0; j<m; j++) {
                if (count[i][j] >= 2) {
                    map[i][j] = 0;
                }
            }
        }
    }

    public static boolean checkIfFinish() {
        for (int i=0; i<n; i++) {
            for (int j=0; j<m; j++) {
                if (map[i][j] == 1) {
                    return false;
                }
            }
        }

        return true;
    }


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());

        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        map = new int[n][m];
        int answer = 0;

        for (int i=0; i<n; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            for (int j=0; j<m; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        while(!checkIfFinish()) {
            bfs();
            answer++;
        }

        System.out.println(answer);
    }

}

'algorithm > 코딩 테스트' 카테고리의 다른 글

백준 2589, 보물섬(java)  (0) 2023.10.09
백준 1766, 문제집(java)  (0) 2023.10.07
백준 10451, 순열 사이클(java)  (0) 2023.10.05
백준 1507, 궁금한 민호(java)  (1) 2023.10.04
백준 2665, 미로 만들기(java)  (1) 2023.10.03