[BeakJoon] 2573 ๋น™์‚ฐ (Java)

SeongWon Ohยท2021๋…„ 12์›” 28์ผ
0
post-thumbnail

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

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


๐Ÿ“ ๋ฌธ์ œํ’€์ด ๋ฐฉ๋ฒ•

ํ•ด๋‹น ๋ฌธ์ œ๋Š” 1๋…„ ๋‹จ์œ„๋กœ ๊ฐ๊ฐ์˜ ๊ตฌ์—ญ์€ ์ธ์ ‘ํ•œ ๋ฐ”๋‹ค์˜ ์นธ ๋งŒํผ์˜ ๋†’์ด๊ฐ€ ๊ฐ์†Œํ•˜๊ฒŒ ํ•˜๊ฒŒ ํ•˜๋ฉฐ ๋น™์‚ฐ์ด 2์กฐ๊ฐ ์ด์ƒ์œผ๋กœ ์ชผ๊ฐœ์งˆ ๊ฒฝ์šฐ ๊ทธ๋•Œ๊นŒ์ง€ ๋ช‡๋…„์ด ๊ฑธ๋ ธ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ตœ๊ทผ ์šฐํ…Œ์ฝ” ํ”„๋ฆฌ์ฝ”์Šค๋ฅผ ํ†ตํ•ด ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๋ฉฐ main๋ฉ”์„œ๋“œ๋ฅผ ์ œ์™ธํ•œ 5๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ’€์ดํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ฐ๊ฐ์˜ ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
meltForYear(): melt ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•œ ํ•ด๊ฐ€ ์ง€๋‚จ์— ๋”ฐ๋ฅธ ๋น™์‚ฐ์˜ ๋†’์ด(matrix)๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค.
melt(): ํ•ด๋‹น ์นธ์— ์ธ์ ‘ํ•œ ๋ฐ”๋‹ท๋ฌผ ์นธ์„ ์ฒดํฌํ•˜๋ฉฐ ๋ณ€ํ•˜๋Š” ๋น™์‚ฐ์˜ ๋†’์ด๋ฅผ returnํ•ด์ค€๋‹ค.
checkSeparate(): ๋น™์‚ฐ์ด ๋‘ ๋ฉ์ด ์ด์ƒ์œผ๋กœ ๋‚˜๋‰˜์—ˆ๋Š”์ง€ ์ฒดํฌ๋ฅผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.
dfs(): checkSeparate()์—์„œ ํ˜ธ์ถœ๋˜์–ด ๋ฐ”๋‹ค๊ฐ€ ์•„๋‹Œ ์ธ์ ‘ํ•œ ๋น™์‚ฐ ์นธ๋“ค์„ ์ˆœํšŒํ•˜๋ฉฐ ์ฒดํฌํ•œ๋‹ค.
checkAllMelt(): ๋น™์‚ฐ์ด ๋ชจ๋‘ ๋…น์•˜๋Š”์ง€ ์ฒดํฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์ค๋‹ˆ๋‹ค.

์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ ๋‚˜์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์™€์„œ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์ฒซ ํ’€์ด์˜ ์‹œ๊ฐ„์ดˆ๊ณผ ์ด์œ ๋Š” checkAllMelt()๋ฉ”์„œ๋“œ์˜ ๋ถ€์žฌ๋กœ ๋น™์‚ฐ์ด ๋ชจ๋‘ ๋…น์„ ๋–„๊นŒ์ง€ ๋‘ ๋ฉ์ด ์ด์ƒ์˜ ๋น™์‚ฐ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์ธ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์ง€๊ฒŒ ๋˜์–ด ์‹œ๊ฐ„์ดˆ๊ณผ๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.
๐Ÿ’ก ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค๋ฉด ์ €์ฒ˜๋Ÿผ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์ฝ๊ณ  ๋†“์นœ ์กฐ๊ฑด์ด ์—†๋Š”์ง€ ์ฒดํฌํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.


๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ์ž‘์„ฑํ•œ ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int N;
    static int M;
    static int[][] matrix;
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, -1, 0, 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());
        matrix = new int[N][M];

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < M; j++) {
                matrix[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        int result = 0;
        while (!checkSeparate()) {
            meltForYear();
            result++;
            if (checkAllMelt()) {
                result = 0;
                break;
            }
        }
        System.out.println(result);
    }

    // 1๋…„ ๋‹จ์œ„๋กœ ๋†’์ด ์ถ•์†Œํ•˜๋Š” ๋ฉ”์„œ๋“œ
    private static void meltForYear() {
        int[][] tempMatrix = new int[N][M];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (matrix[i][j] > 0)
                    tempMatrix[i][j] = melt(i, j);
            }
        }
        matrix = tempMatrix;
    }

    // ๊ฐ๊ฐ์˜ ์นธ์„ ๋…น์ด๋Š” ๋ฉ”์„œ๋“œ
    private static int melt(int y, int x) {
        int count = 0;
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx < 0 || nx >= M || ny < 0 || ny >= N || matrix[ny][nx] == 0) {
                count++;
            }
        }
        if (matrix[y][x] >= count) {
            return matrix[y][x] - count;
        }
        return 0;
    }

    // ๋‘ ๋ฉ์ด ์ด์ƒ์œผ๋กœ ๋‚˜๋‰˜์—ˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ฉ”์„œ๋“œ
    private static boolean checkSeparate() {
        boolean[][] checked = new boolean[N][M];
        int count = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (matrix[i][j] > 0 && !checked[i][j]) {
                    dfs(i, j, checked);
                    count++;
                }
                if (count >= 2) return true;
            }
        }
        return false;
    }

    // dfs ํƒ์ƒ‰ ๋ฉ”์„œ๋“œ
    private static void dfs(int y, int x, boolean[][] checked) {
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx < 0 || nx >= M || ny < 0 || ny >= N || matrix[ny][nx] == 0 || checked[ny][nx]) {
                continue;
            }
            checked[ny][nx] = true;
            dfs(ny, nx, checked);
        }
    }

    // ๋น™์‚ฐ์ด ๋ชจ๋‘ ๋…น์•˜๋Š”์ง€ ์ฒดํฌ
    private static boolean checkAllMelt() {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (matrix[i][j] != 0) {
                    return false;
                }
            }
        }
        return true;
    }
}

profile
๋ธ”๋กœ๊ทธ ์ด์ „ํ–ˆ์Šต๋‹ˆ๋‹ค. -> https://seongwon.dev/

0๊ฐœ์˜ ๋Œ“๊ธ€