๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
728x90
๐Ÿ”—๋ฌธ์ œ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ
 

2636๋ฒˆ: ์น˜์ฆˆ

์ฒซ์งธ ์ค„์—๋Š” ์‚ฌ๊ฐํ˜• ๋ชจ์–‘ ํŒ์˜ ์„ธ๋กœ์™€ ๊ฐ€๋กœ์˜ ๊ธธ์ด๊ฐ€ ์–‘์˜ ์ •์ˆ˜๋กœ ์ฃผ์–ด์ง„๋‹ค. ์„ธ๋กœ์™€ ๊ฐ€๋กœ์˜ ๊ธธ์ด๋Š” ์ตœ๋Œ€ 100์ด๋‹ค. ํŒ์˜ ๊ฐ ๊ฐ€๋กœ์ค„์˜ ๋ชจ์–‘์ด ์œ— ์ค„๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์ค„๊นŒ์ง€ ์ฃผ์–ด์ง„

www.acmicpc.net

 

๐Ÿ‘จ‍๐Ÿ’ปํ’€์ด ๊ณผ์ •

 

๊ตฌํ˜„ ๋ฌธ์ œ๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—, ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ๋ณ„๋กœ ํ•จ์ˆ˜ํ™”ํ•˜์—ฌ ์ ‘๊ทผํ•˜๋Š” ๊ฒŒ ๊ฐ€์žฅ ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ์š”๊ตฌ์‚ฌํ•ญ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


1. ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์ž…๋ ฅ์„ ๋ฐ›๋Š” ํ•จ์ˆ˜ 

 

๋ฌธ์ œ์—์„œ ๊ฐ€๋กœ ํ–‰์˜ ๊ฐœ์ˆ˜์™€ ์„ธ๋กœ ํ–‰์˜ ๊ฐœ์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ํŒ์˜ ์ƒํƒœ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์ค๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‚ด์šฉ๋“ค์„ ๋ฐฐ์—ด์— ์ž…๋ ฅ๋ฐ›๋˜, ์น˜์ฆˆ์˜ ๊ฐœ์ˆ˜ ๋˜ํ•œ ์„ธ์„œ ๋ณ„๋„์˜ ๋ณ€์ˆ˜์— ์ €์žฅํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์น˜์ฆˆ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋ฃจํ”„ ์ข…๋ฃŒ ์กฐ๊ฑด์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

 

2. ๊ณต๊ธฐ๋ฅผ ์ฃผ๋ณ€์œผ๋กœ ํ™•์‚ฐ์‹œํ‚ค๋Š” ํ•จ์ˆ˜

 

ํ•ด๋‹น ๋ฌธ์ œ์˜ ์ดˆ๊ธฐ ๋นˆ ์ •์‚ฌ๊ฐํ˜•์€ ์น˜์ฆˆ์˜ ๋ฐ”๊นฅ์— ์žˆ๋‹ค๋ฉด ๊ณต๊ธฐ๋ฅผ, ์น˜์ฆˆ์˜ ๋‚ด๋ถ€์— ์žˆ๋‹ค๋ฉด ์ง„๊ณต ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ณต๊ธฐ์™€ ์ ‘์ด‰ํ•œ ์น˜์ฆˆ๊ฐ€ ๋…น์•„ ๋‚ด๋ถ€ ์ง„๊ณต ๊ณต๊ฐ„์ด ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋˜๋ฉด, ๊ณต๊ธฐ๊ฐ€ ์•ˆ์— ํ˜๋Ÿฌ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

3. ๊ณต๊ธฐ์— ๋…ธ์ถœ๋œ ์น˜์ฆˆ๋ฅผ ์ฐพ๋Š” ํ•จ์ˆ˜

 

์ด ๋ฌธ์ œ์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. 2์ค‘ for ๋ฌธ์œผ๋กœ ์ „์ฒด ๋งต์„ ์ˆœํšŒํ•˜๋‹ค๊ฐ€ ์น˜์ฆˆ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด, ํ•ด๋‹น ์น˜์ฆˆ์˜ ์ƒํ•˜์ขŒ์šฐ ์ธ์ ‘ ์นธ์„ ์กฐ์‚ฌํ•˜์—ฌ ๊ณต๊ธฐ๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ณต๊ธฐ๊ฐ€ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์น˜์ฆˆ๋Š” ํ•œ ์‹œ๊ฐ„ ๋’ค์— ๋…น์•„๋‚ด๋ฆด ์น˜์ฆˆ์ด๋ฏ€๋กœ ์ œ๊ฑฐ ๋Œ€์ƒ ๋ฆฌ์ŠคํŠธ์— ์˜ฌ๋ ค์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

4. ๊ณต๊ธฐ์— ๋…ธ์ถœ๋œ ์น˜์ฆˆ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํ•จ์ˆ˜

 

3๋ฒˆ ํ•จ์ˆ˜์—์„œ ์ฐพ์€ ์น˜์ฆˆ๋“ค์„ ์ œ๊ฑฐํ•ด์ฃผ๋ฉด ๋˜์ง€๋งŒ, ์ค‘์š”ํ•œ ์ ์€ ์ œ๊ฑฐํ•œ ์น˜์ฆˆ๊ฐ€ ๋‚ด๋ถ€ ์ง„๊ณต ๊ณต๊ฐ„์˜ ๋ฒฝ ์—ญํ• ์„ ํ•˜๋˜ ์น˜์ฆˆ์ผ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด ๋•Œ์—๋Š” ๊ณต๊ธฐ๊ฐ€ ๋‚ด๋ถ€ ์ง„๊ณต ๊ณต๊ฐ„์œผ๋กœ ์œ ์ž…๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ, ์น˜์ฆˆ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ 2๋ฒˆ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ณต๊ธฐ ํ™•์‚ฐ์„ ์‹œ์ผœ์ค๋‹ˆ๋‹ค.


 

์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ์น˜์ฆˆ๊ฐ€ ๋‹ค ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€ 3, 4๋ฒˆ ํ•จ์ˆ˜๋ฅผ ๋Œ๋ฆฌ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋ฃจํ”„๋ฅผ ํ•œ ๋ฒˆ ๋Œ ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ„์„ +1 ํ•ด์ฃผ๊ณ , ์ œ๊ฑฐํ•˜๊ธฐ ์ „์˜ ์น˜์ฆˆ ๊ฐœ์ˆ˜ ๋˜ํ•œ ๋ณ„๋„๋กœ ์ €์žฅํ•ด์ฃผ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

โœ๏ธ์†Œ์Šค ์ฝ”๋“œ ๋ฐ ๊ฒฐ๊ณผ

#include <iostream>
#include <vector>
#include <queue>

using namespace std;
using Point = pair<int, int>;
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
#define AIR -1
#define VACUUM 0
#define CHEESE 1
#define AIR_EXPOSED_CHEESE 2

int MaxRow, MaxColumn, NumOfCheeses;
vector<vector<int>> Field;
vector<Point> Directions { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
queue<Point> AirExposedCheeses;

void Initialize()
{
    cin >> MaxRow >> MaxColumn;
    Field.resize(MaxRow, vector<int>(MaxColumn));

    for (int r = 0; r < MaxRow; r++)
    {
        for (int c = 0; c < MaxColumn; c++)
        {
            cin >> Field[r][c];
            if (Field[r][c] == CHEESE) NumOfCheeses++;
        }
    }
}

void SetExternalAir(int row, int column)
{
    queue<Point> externalAirs;
    Field[row][column] = AIR;
    externalAirs.push(Point(row, column));

    while (!externalAirs.empty())
    {
        row = externalAirs.front().first;
        column = externalAirs.front().second;
        externalAirs.pop();

        for (const Point& direction : Directions)
        {
            int nextRow = row + direction.first;
            int nextColumn = column + direction.second;

            if (nextRow < 0 or nextRow >= MaxRow or nextColumn < 0 or nextColumn >= MaxColumn)
                continue;
            if (Field[nextRow][nextColumn] == CHEESE or Field[nextRow][nextColumn] == AIR)
                continue;
            
            Field[nextRow][nextColumn] = AIR;
            externalAirs.push(Point(nextRow, nextColumn));
        }
    }
}

bool IsAirExposedCheese(int row, int column)
{
    for (const Point& direction : Directions)
    {
        int nextRow = row + direction.first;
        int nextColumn = column + direction.second;

        if (Field[nextRow][nextColumn] == AIR)
            return true;
    }

    return false;
}

void FindAirExposedCheeses()
{
    for (int r = 0; r < MaxRow; r++)
    {
        for (int c = 0; c < MaxColumn; c++)
        {
            if (Field[r][c] == AIR or Field[r][c] == VACUUM or Field[r][c] == AIR_EXPOSED_CHEESE)
                continue;

            if (IsAirExposedCheese(r, c))
            {
                Field[r][c] = AIR_EXPOSED_CHEESE;
                AirExposedCheeses.push(Point(r, c));
            }
        }
    }
}

int RemoveAirExposedCheeses()
{
    int count = AirExposedCheeses.size();

    for (int i = 0; i < count; i++)
    {
        Point position = AirExposedCheeses.front();
        AirExposedCheeses.pop();
        SetExternalAir(position.first, position.second);
    }

    return count;
}

int main()
{
    FAST_IO
    Initialize();
    SetExternalAir(0, 0);

    int numOfCheesesAnHourAgo = NumOfCheeses;
    int currentNumOfCheeses = NumOfCheeses;
    int hour = 0;
    
    while (currentNumOfCheeses > 0)
    {
        FindAirExposedCheeses();
        numOfCheesesAnHourAgo = currentNumOfCheeses;
        currentNumOfCheeses -= RemoveAirExposedCheeses();
        hour++;
    }

    cout << hour << "\n" << numOfCheesesAnHourAgo;
    return 0;
}

 

 

728x90
๋ฐ˜์‘ํ˜•