티스토리 뷰

알고리즘/백준

백준 2638 (치즈) - java

김다미김태리신시아 2022. 12. 27. 01:50

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

 

2638번: 치즈

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

www.acmicpc.net

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
    static int n = 0;
    static int m = 0;
    static int[][] board = new int[101][101];
    static int[][] visit = new int[101][101];
    static int[][] count = new int[101][101];
    static int[] dx = {0, 0, -1, 1};
    static int[] dy = {1, -1, 0, 0};

    static int total = 0;

    static Queue<point> q = new LinkedList<>();
    static Queue<point> q2 = new LinkedList<>();

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

        String[] line = br.readLine().split(" ");

        n = Integer.parseInt(line[0]);
        m = Integer.parseInt(line[1]);

        for (int i = 1; i <= n; i++) {
            line = br.readLine().split(" ");
            for (int j = 1; j <= m; j++) {
                board[i][j] = Integer.parseInt(line[j - 1]);
                if (i == 1 || i == n || j == 1 || j == m) {
                    q.add(new point(i, j));
                    visit[i][j]=1;
                }

                if(board[i][j]==1)
                {
                    q2.add(new point(i,j));
                    total = total +1;
                }
            }
        }
        int day = 0;

        while(total!=0) {
            white();
            melt();
            day = day+1;
        }

        System.out.println(day);

        br.close();
    }

    static void white()
    {
        while(!q.isEmpty())
        {
            point cur = q.poll();
            for(int i=0;i<4;i++)
            {
                int nx = cur.x+dx[i];
                int ny = cur.y+dy[i];

                if(nx>=1&&ny>=1&&nx<=n&&ny<=m)
                {
                    if(board[nx][ny]==0&&visit[nx][ny]==0)
                    {
                        visit[nx][ny]=1;
                        q.add(new point(nx,ny));
                    }

                    if(board[nx][ny]==1)
                    {
                        count[nx][ny]= count[nx][ny]+1;
                    }
                }
            }
        }
    }

    static void melt()
    {
        int size = q2.size();

        while(size!=0)
        {
            size--;
            point cur = q2.poll();
            if(count[cur.x][cur.y]>=2)
            {
                q.add(new point(cur.x,cur.y));
                visit[cur.x][cur.y]=1;
                board[cur.x][cur.y]=0;
                total = total-1;
            }
            else
            {
                q2.add(new point(cur.x,cur.y));
            }
        }
    }

}
class point
{
    int x;
    int y;
    point(int x,int y)
    {
        this.x = x;
        this.y = y;
    }
}

예전 골드 4 짜리 치즈 문제에서 살짝만 변형된 문제입니다. 주위 2개 이상 바깥 쪽 공기 탐색 말고는 그대로이기 때문에 따로 코드 분석은 하지 않겠습니다.

'알고리즘 > 백준' 카테고리의 다른 글

백준 19238 (스타트 택시) java  (0) 2022.12.30
백준 2589 (보물섬) - java  (0) 2022.12.27
백준 1303 (전쟁 - 전투) java  (0) 2022.12.06
백준 18405 (경쟁적 전염) java  (0) 2022.12.02
백준 2636 (치즈) java  (0) 2022.12.01