Skip to content

Conversation

@kangrae-jo
Copy link
Collaborator

@kangrae-jo kangrae-jo commented Jul 18, 2025

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

[์น˜์ฆˆ]

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

1h 30m...

โœจ ์ˆ˜๋„ ์ฝ”๋“œ

์˜ค๋žœ๋งŒ์ด๋„ค์š”.
์˜ค๋Š˜์€ ์žฌ๋ฐŒ๋Š” ๊ตฌํ˜„ ๋ฌธ์ œ ๋“ค๊ณ ์™€๋ดค์Šต๋‹ˆ๋‹ค.
์ƒ์–ด์‹œ๋ฆฌ์ฆˆ๋ณด๋‹ค๋Š” ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์ฒ˜์Œ์— ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ์ด๋ ‡๊ฒŒ ์ƒ๊ฐ์„ ํ–ˆ์–ด์š”.

1. (0,0)์œผ๋กœ ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” "์™ธ๋ถ€ ๊ณต๊ธฐ"๋ฅผ ํŒŒ์•…
2. N*M board๋ฅผ ์‚ดํŽด๋ณด๋ฉฐ (board[y][x] == ์น˜์ฆˆ && 2๋ฉด ์ด์ƒ์ด "์™ธ๋ถ€ ๊ณต๊ธฐ")๋ฉด ๋…น์ด๊ธฐ
3-1. "๋‚ด๋ถ€ ๊ณต๊ธฐ" ๋ฅผ "์™ธ๋ถ€ ๊ณต๊ธฐ"๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์‹œ 1๋ฒˆ์œผ๋กœ
3-2. ๋” ์ด์ƒ ๋…น์ผ ์น˜์ฆˆ๊ฐ€ ์—†๋‹ค๋ฉด ์ข…๋ฃŒ

์Œ.. ๊ทผ๋ฐ ์ €๋Š” ์ด ๋ฐฉ์‹์€ N๊ณผ M์ด ์ตœ๋Œ€ 100์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์–ด์š”.

2 * N์ตœ๋Œ€ * M์ตœ๋Œ€ * ๋‚ ์งœ ์ตœ๋Œ€ = 2 * 100 * 100 * 50

// 2๋ฅผ ๊ณฑํ•œ ์ด์œ ๋Š” ์ˆ˜๋„์ฝ”๋“œ 1๋ฒˆ๊ณผ 2๋ฒˆ์—์„œ N*M ์ด๋ผ์„œ.
// ๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜๋„ ์ฝ”๋“œ 1๋ฒˆ ๊ณผ์ •์€ bfs๋ผ์„œ ์ƒ๊ฐ๋ณด๋‹ค ์ ์Œ (๋งค๋ฒˆ N*M์€ ์•„๋‹˜)
// ๋‚ ์งœ ์ตœ๋Œ€๋Š” ๋ชจ์„œ๋ฆฌ ์ œ์™ธ ๋ชจ๋“ ์นธ์ด ์น˜์ฆˆ์ผ๋•Œ... ์ด๊ฒฌ์žˆ์œผ๋ฉด ๋งํ•ด์ฃผ์„ธ์š”

๊ทธ๋Ÿฐ๋ฐ ๊ฒฐ๋ก ๋งŒ ๋จผ์ € ๋ง์”€๋“œ๋ฆฌ์ž๋ฉด ์ด๋ ‡๊ฒŒ ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค....
์ €๋Š” ๊ทธ๊ฑธ ๋ชจ๋ฅด๊ณ  ๋บ‘ ๋‘˜๋Ÿฌ ๊ฐ”๋„ค์š”.
๊ทธ๋ž˜๋„ ํ‹€๋ฆฐ ํ’€์ด๋„ ์‚ด์ง ๋ง์”€๋“œ๋ ค๋ณผ๊ฒŒ์š”.

์œ„ ๋ฐฉ์‹์˜ ๋ฌธ์ œ๋Š” ์ˆ˜๋„์ฝ”๋“œ 1, 2๋ฒˆ์—์„œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์–ด์š”.
๊ทธ๋ž˜์„œ ํ˜„์žฌ ๋…น์•„์žˆ์ง€ ์•Š์€ ์น˜์ฆˆ๋ฅผ ํ์— ๋„ฃ๊ณ , ํ˜„์žฌ "์™ธ๋ถ€๊ณต๊ธฐ"๋ฅผ ํ์—๋„ฃ๊ณ  ์ด๋ฆฌ์ €๋ฆฌ ๊ตด๋ฆฌ๋Š”... ๊ทธ๋Ÿฐ๊ฑธ ํ–ˆ์–ด์š”.

ํ…Œ์ผ€๋Š” ๋งž์•˜์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋œจ๋”๋ผ๊ตฌ์š”.
์•„๋งˆ ํŠน์ • ์ผ€์ด์Šค์—์„œ ํ๊ฐ€ ๋ฌดํ•œ ํŒฝ์ฐฝ ํ–ˆ๋‚˜๋ด์š”..

๊ทธ๋ž˜์„œ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•˜๋˜ ๋„์ค‘ '์ฒ˜์Œ์œผ๋กœ ์ƒ๊ฐํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•œ๋ฒˆ ํ•ด๋ณด์ž ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๋Š”์ง€ ๊ถ๊ธˆํ•˜๋„ค' ๋ผ๋Š” ์ƒ๊ฐ์ด ๋‚ฌ์–ด์š”.
๊ตฌํ˜„์„ ํ•ด๋ณด๋‹ˆ.. ์ •๋‹ต์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„๋“ค๋„ ์–ด๋ ต๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ๋ง๊ณ  ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•ด์„œ ๋ฐ”๋กœ ํ’€์–ด๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

+) ์•„ ์™„์„ฑ๋œ ์ฝ”๋“œ์—์„œ๋Š” resetAir ๋„ ์žˆ์–ด์„œ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ *2 ๊ฐ€ ์•„๋‹ˆ๋ผ *3 ์ธ๊ฒƒ ๊ฐ™๋„ค์š”.

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

c++์—์„œ 1์ดˆ๋Š” ์•ฝ 100,000,000๋ฒˆ ์—ฐ์‚ฐ์ด ๋œ๋‹ค๊ณ  ํ•˜๋„ค์š”.
์ด ๋ฌธ์ œ๋Š” ์•ฝ 1,000,000๋ฒˆ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜๋‹ˆ ํ†ต๊ณผ์ธ๊ฐ€ ๋ด…๋‹ˆ๋‹ค.

Copy link
Collaborator

@kokeunho kokeunho left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ฒ˜์Œ์— ๋‚ด๋ถ€ ๊ณต๊ฐ„ ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋‚˜ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์ƒ์–ด๋ฌธ์ œ๋ฅผ ํ’€๋‹ค์™€์„œ์ผ๊นŒ์š”. ๋น„๊ต์  ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
(0, 0)์ง€์ ์—์„œ๋ถ€ํ„ฐ bfs๋กœ 0์ธ ๊ฐ’์„ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ ์น˜์ฆˆ๊ฐ€ ์žˆ๋Š” ๊ฐ’์„ ๋งŒ๋‚˜๋ฉด ํ•ด๋‹น ์น˜์ฆˆ ์ง€์ ์˜ ์ ‘์ด‰๋ฉด ๊ฐ’์„ +1 ํ•ด์ฃผ๊ณ 
bfs๊ฐ€ ๋๋‚œ ์‹œ์ ์— ์ ‘์ด‰๋ฉด ๊ฐ’์ด 2์ด์ƒ์ธ ์น˜์ฆˆ๋ฅผ ์ œ๊ฑฐํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
๋‚ด๋ถ€ ๊ณต๊ฐ„์€ bfs๋กœ ์–ด์ฐจํ”ผ ๋„๋‹ฌํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์น˜์ฆˆ๊ฐ€ ๋ชจ๋‘ ์—†์–ด์งˆ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ๋‹ต์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์žฌ๋ฐŒ๋Š” ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค~!!@@

Details

import java.util.*;

public class Main {
    static int N, M;
    static int[][] map;
    static boolean[][] visited;
    static int[][] contact;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        N = sc.nextInt();
        M = sc.nextInt();
        map = new int[N][M];

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                map[i][j] = sc.nextInt();
            }
        }

        visited = new boolean[N][M];
        contact = new int[N][M];

        int deleteCount = 0;
        while (true) {
            if (checkMap()) {
                bfs(0, 0);
                deleteCheese();
                deleteCount++;
                initArr();
            } else {
                break;
            }
        }
        System.out.println(deleteCount);
    }
    static void bfs (int x, int y) {
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[]{x, y});
        visited[x][y] = true;

        while (!queue.isEmpty()) {
            int[] current = queue.poll();
            for (int i = 0; i < 4; i++) {
                int nx = current[0] + dx[i];
                int ny = current[1] + dy[i];
                if (nx >= 0 && nx < N && ny >= 0 && ny < M) {
                    if (map[nx][ny] == 0 && !visited[nx][ny]) {
                        queue.add(new int[]{nx, ny});
                        visited[nx][ny] = true;
                    }
                    if (map[nx][ny] == 1) contact[nx][ny] += 1;
                }
            }
        }
    }
    static boolean checkMap() {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (map[i][j] == 1) return true;
            }
        }
        return false;
    }
    static void deleteCheese() {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (contact[i][j] >= 2) map[i][j] = 0;
            }
        }
    }
    static void initArr() {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                visited[i][j] = false;
                contact[i][j] = 0;
            }
        }
    }
}

Copy link
Member

@9kyo-hwang 9kyo-hwang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์กฐ๊ธˆ ๋” ์‹ฌํ”Œํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด, (0, 0) ์œ„์น˜์—์„œ bfs๋ฅผ ์ˆœํšŒํ•ด ๋นˆ ์นธ์œผ๋กœ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ 1. ๊ฐ ์น˜์ฆˆ ๋ณ„ ๊ณต๊ธฐ์— ์ ‘์ด‰ํ•œ ํšŸ์ˆ˜๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ 2. ์น˜์ฆˆ ์•ˆ์ชฝ์˜ ๋นˆ ๊ณต๊ฐ„์€ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

vector<vector<int>> GetNumContactsCheeses() {
    queue<pair<int, int>> q;
    vector<vector<bool>> visited(N, vector<bool>(M, false));
    
    q.emplace(0, 0);
    visited[0][0] = true;
    
    vector<vector<int>> numContactsCheeses(N, vector<int>(M, 0));
    
    // ๋นˆ ์นธ์œผ๋กœ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” bfs
    while(!q.empty()) {
        const auto [x, y] = q.front();
        q.pop();
        
        for(const auto& [dx, dy] : OFFSET) {
            int nx = x + dx, ny = y + dy;
            if(OutOfBound(nx, ny) || visited[nx][ny]) {
                continue;
            }
            
            if(isCheese[nx][ny]) {  // ๋‹ค์Œ ์นธ์ด ์น˜์ฆˆ๋ผ๋ฉด ๊ณต๊ธฐ์™€ ๋งž๋‹ฟ๋Š” ๊ฒƒ
                numContactsCheeses[nx][ny]++;
            } else {  // ์•„๋‹ˆ๋ผ๋ฉด ํ์ž‰
                visited[nx][ny] = true;
                q.emplace(nx, ny);
            }
        }
    }
    
    return numContactsCheeses;
}

์ด๋Ÿฐ ์‹์œผ๋กœ ํ•œ ๋ฒˆ bfs๋ฅผ ์ˆœํšŒํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ์น˜์ฆˆ ๋ณ„๋กœ "๊ณต๊ธฐ์— ๋ช‡ ๋ฒˆ ์ ‘์ด‰ํ–ˆ๋Š”๊ฐ€"๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ

for(int i = 0; i < N; ++i) {
    for(int j = 0; j < M; ++j) {
        if(numContactsCheeses[i][j] >= 2) {
            isCheese[i][j] = false;
        }
    }
}

2ํšŒ ์ด์ƒ ๊ณต๊ธฐ์— ์ ‘์ด‰ํ•œ ์น˜์ฆˆ๋งŒ ๋…น์ด๋ฉด(์—ฌ๊ธฐ์„œ๋Š” bool ๊ฐ’์„ false๋กœ ์„ธํŒ…) ๋ฉ๋‹ˆ๋‹ค.

์ด 2๊ฐ€์ง€ ๊ณผ์ •์„ "๋ชจ๋“  ์น˜์ฆˆ๊ฐ€ ๋…น์„ ๋•Œ๊นŒ์ง€" ๋ฐ˜๋ณตํ•˜๊ณ , ๊ทธ ๋ฃจํ”„ ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

#include <bits/stdc++.h>

using namespace std;

int N, M;
vector<vector<int>> isCheese;
const vector<pair<int, int>> OFFSET {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

inline bool OutOfBound(int x, int y) {
    return x < 0 || x >= N || y < 0 || y >= M;
}

bool IsAllMelted() {
    for(int i = 0; i < N; ++i) {
        for(int j = 0; j < M; ++j) {
            if(isCheese[i][j]) {
                return false;
            }
        }
    }
    
    return true;
}

vector<vector<int>> GetNumContactsCheeses() {
    queue<pair<int, int>> q;
    vector<vector<bool>> visited(N, vector<bool>(M, false));
    
    q.emplace(0, 0);
    visited[0][0] = true;
    
    vector<vector<int>> numContactsCheeses(N, vector<int>(M, 0));
    
    while(!q.empty()) {
        const auto [x, y] = q.front();
        q.pop();
        
        for(const auto& [dx, dy] : OFFSET) {
            int nx = x + dx, ny = y + dy;
            if(OutOfBound(nx, ny) || visited[nx][ny]) {
                continue;
            }
            
            if(isCheese[nx][ny]) {
                numContactsCheeses[nx][ny]++;
            } else {
                visited[nx][ny] = true;
                q.emplace(nx, ny);
            }
        }
    }
    
    return numContactsCheeses;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    cin >> N >> M;
    isCheese.resize(N, vector<int>(M));
    
    for(auto& row : isCheese) {
        for(auto& col : row) {
            cin >> col;
        }
    }
    
    int tick;
    for(tick = 0; !IsAllMelted(); ++tick) {
        vector<vector<int>> numContactsCheeses = GetNumContactsCheeses();
        
        for(int i = 0; i < N; ++i) {
            for(int j = 0; j < M; ++j) {
                if(numContactsCheeses[i][j] >= 2) {
                    isCheese[i][j] = false;
                }
            }
        }
    }
    
    cout << tick;

    return 0;
}

@kangrae-jo
Copy link
Collaborator Author

์กฐ๊ธˆ ๋” ์‹ฌํ”Œํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ...

๊ทธ๋ ‡๋„ค์š”. ๊ทธ๋ƒฅ ์™ธ๋ถ€์—์„œ bfs ๋Œ๋ฆฌ๊ณ 
๊ฐ ์น˜์ฆˆ๊ฐ€ ์™ธ๋ถ€ ๊ณต๊ธฐ๋ž‘ ๋ช‡ ๋ฒˆ(?) ์ ‘์ด‰ํ–ˆ๋Š”์ง€ ๋ณด๋ฉด ๋˜๋Š” ๊ตฐ์š”

Copy link
Collaborator

@g0rnn g0rnn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ „ ๋ฌธ์ œ์—์„œ ๊ฐ€์žฅ์ž๋ฆฌ์—๋Š” ์น˜์ฆˆ๋ฅผ ๋†“์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์„œ ์™ธ๋ถ€์—์„œ bfs๋ฅผ ๋Œ๋ ธ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๋ฌธํ•˜๋Š” ์œ„์น˜๊ฐ€ ์น˜์ฆˆ๋ผ๋ฉด cheese[y][x] = true ํ•ด๋‘๊ณ , ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์น˜์ฆˆ๋ผ๋ฉด ์ œ๊ฑฐํ•ด์•ผํ•  ์น˜์ฆˆ๋ฆฌ์ŠคํŠธ์— ์‚ฝ์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š”๊ฑด ๊ฐ€์žฅ์ž๋ฆฌ๋ผ๋Š” ๋œป์ด๋‹ˆ๊น์š”

์žฌ๋ฐŒ๋Š” ๋ฌธ์ œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :0 ๊ณ ์ƒํ•˜์…จ์–ด์š”

package beakjoon;

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

public class Sol2638_1 {
    static int n, m;
    static int[][] board;
    static int[][] offset = {{1, 0}, {0, 1}, {-1, 0}, {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());
        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());
            }
        }
        br.close();

        System.out.println(melt());
    }

    private static int melt() {
        int hour = 0;
        List<int[]> pos;
        while (true) {
            pos = bfs();
            if (pos.isEmpty()) break;
            for (int[] p : pos) {
                int x = p[0], y = p[1];
                board[y][x] = 0;
            }
            hour++;
        }
        return hour;
    }

    private static List<int[]> bfs() {
        List<int[]> corner = new ArrayList<>();
        Queue<int[]> q = new ArrayDeque<>();
        boolean[][] visited = new boolean[n][m];
        boolean[][] cheese = new boolean[n][m];

        q.offer(new int[]{0, 0}); // ๊ฐ€์žฅ์ž๋ฆฌ๋Š” ํ•ญ์ƒ ๋น„์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—
        visited[0][0] = true;

        while (!q.isEmpty()) {
            int x = q.peek()[0];
            int y = q.poll()[1];

            for (int[] o : offset) {
                int nx = x + o[0];
                int ny = y + o[1];

                if (nx < 0 || nx >= m || ny < 0 || ny >= n) continue;
                if (visited[ny][nx]) continue;
                if (board[ny][nx] == 1) {
                    if (cheese[ny][nx]) corner.add(new int[]{nx, ny});
                    cheese[ny][nx] = true;
                    continue;
                }
                q.offer(new int[]{nx, ny});
                visited[ny][nx] = true;
            }
        }
        return corner;
    }
}

Copy link
Collaborator

@wnsmir wnsmir left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ƒ์–ด๋ฌธ์ œ๋ฅผ ์›Œ๋‚™๋งŽ์ด ํ’€๋‹ค๋ณด๋‹ˆ๊นŒ ์ด๋ฌธ์ œ๋Š” 20๋ถ„์กฐ๊ธˆ ์•ˆ๋˜์–ด ๋‹คํ’€์—ˆ๋„ค์š”

์ฒ˜์Œ์— ๋ฌธ์ œ๋ฅผ ๋Œ€์ถฉ์ฝ์–ด ๊ณต๊ธฐ์— ์ ‘์ด‰ํ•˜๋ฉด ์ „๋ถ€ ํ„ด์ข…๋ฃŒ์ „์— 0์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค๊ฐ€ ํ‹€๋ ค์„œ ๋‹ค์‹œ๋ดค์Šต๋‹ˆ๋‹ค.
๋‚ด๋ถ€๊ณต๊ธฐ ์™ธ๋ถ€๊ณต๊ธฐ๋Š” ๋‹ค๋ฅด๋”๋ผ๊ตฌ์š”,,

๋ฌธ์ œ๋Š” ์ฐฉํ•˜๊ฒŒ ์™ธ๋ถ€ํƒœ๋‘๋ฆฌ๋ฅผ ๋ฌด์กฐ๊ฑด ๊ณต๊ธฐ๋กœ ๋‘๊ฒŒ ํ•ด๋†“์•˜์Šต๋‹ˆ๋‹ค.
์ด์œ ๋ฅผ ๋ฐ”๋กœ ํŒŒ์•…ํ•œ๊ฒŒ ์–ด์ฐจํ”ผ ์™ธ๋ถ€๊ณต๊ธฐ๋Š” ํƒœ๋‘๋ฆฌ์™€ ์ ‘ํ•ด์žˆ๋Š”๊ณณ์ด๋ผ 0,0์—์„œ bfs๋ฅผ ๋Œ๋ฆฌ๋ฉด ์™ธ๋ถ€๊ณต๊ธฐ๋Š” ํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰ ์™ธ๋ถ€๊ณต๊ธฐ๋ฅผ bfs๋ฅผ ํ†ตํ•ด ํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ๋งคํ„ด๋งˆ๋‹ค ์™ธ๋ถ€๊ณต๊ธฐ์™€ 2๊ฐœ์ด์ƒ ์ ‘์ด‰ํ•œ ์น˜์ฆˆ๋Š” melt ๋ฆฌ์ŠคํŠธ์— ๋„ฃ์–ด์ฃผ์–ด ๊ฐœ์ˆ˜๋ฅผ ์ƒˆ๊ณ  ๋‹ค์‹œ 0์œผ๋กœ ๋ฐ”๊พธ์–ด์ค๋‹ˆ๋‹ค.

๋‹ค์Œํ„ด์— ๋‹ค์‹œ 0,0 bfs๋ฅผ 1ํšŒ ์ง„ํ–‰ํ•˜์—ฌ ์™ธ๋ถ€๊ณต๊ธฐ์— ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ  ๋‹ค์‹œ ๋…น์ผ ์น˜์ฆˆ๋ฅผ ์„ ์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

from collections import deque

R, C = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(R)]
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]

turn = 0
last_cheezes = 0

while True:
    # ๋‚จ์€ ์น˜์ฆˆ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ
    cheezes = sum(grid[i][j] == 1 for i in range(R) for j in range(C))
    if cheezes == 0:
        print(turn)
        break
    last_cheezes = cheezes
    turn += 1

    # ์™ธ๋ถ€ ๊ณต๊ธฐ๋งŒ BFS๋กœ ํ‘œ์‹œ
    air = [[False]*C for _ in range(R)]
    queue = deque()
    queue.append((0, 0))
    air[0][0] = True

    while queue:
        x, y = queue.popleft()
        for d in range(4):
            nx, ny = x + dx[d], y + dy[d]
            # ์™ธ๋ถ€๊ณต๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ฉด์„œ ์ผ๋ฐ˜๊ณต๊ธฐ๋ผ๋ฉด
            if 0 <= nx < R and 0 <= ny < C and not air[nx][ny] and grid[nx][ny] == 0:
                air[nx][ny] = True
                queue.append((nx, ny))

    # ์™ธ๋ถ€ ๊ณต๊ธฐ์™€ ์ ‘์ด‰ํ•œ ์น˜์ฆˆ ์œ„์น˜ ์ˆ˜์ง‘
    melt = []
    for x in range(R):
        for y in range(C):
            if grid[x][y] == 1:
                count = 0
                for d in range(4):
                    nx, ny = x + dx[d], y + dy[d]
                    if air[nx][ny]:
                        count += 1
                    if count >1:
                        melt.append((x, y))
                        break

    # ์น˜์ฆˆ ๋…น์ด๊ธฐ
    for x, y in melt:
        grid[x][y] = 0

@kangrae-jo kangrae-jo merged commit 8af0c3f into main Jul 25, 2025
@kangrae-jo kangrae-jo deleted the 30-kangrae-jo branch July 25, 2025 14:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants