BOJ 2638. ์น์ฆ
๐โโ๏ธ[Gold III] ์น์ฆ - 2638
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2428 KB, ์๊ฐ: 156 ms
๋ถ๋ฅ
๋๋น ์ฐ์ ํ์, ๊น์ด ์ฐ์ ํ์, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ๊ตฌํ, ์๋ฎฌ๋ ์ด์
์ ์ถ ์ผ์
2024๋ 2์ 15์ผ 16:48:52
๋ฌธ์ ์ค๋ช
NรM์ ๋ชจ๋์ข ์ด ์์ ์์ฃผ ์์ ์น์ฆ๊ฐ <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ํ์๋์ด ์๋ค. ๋จ, N ์ ์ธ๋ก ๊ฒฉ์์ ์์ด๊ณ , M ์ ๊ฐ๋ก ๊ฒฉ์์ ์์ด๋ค. ์ด ์น์ฆ๋ ๋๋ ๋ณด๊ด์ ํด์ผ๋ง ํ๋๋ฐ ์ค๋ด์จ๋์ ๋ด์ด๋์ผ๋ฉด ๊ณต๊ธฐ์ ์ ์ดํ์ฌ ์ฒ์ฒํ ๋ น๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฌํ ๋ชจ๋์ข ์ด ๋ชจ์์ ์น์ฆ์์ ๊ฐ ์น์ฆ ๊ฒฉ์(์ ์ ์ ์ฌ๊ฐํ ๋ชจ์)์ 4๋ณ ์ค์์ ์ ์ด๋ 2๋ณ ์ด์์ด ์ค๋ด์จ๋์ ๊ณต๊ธฐ์ ์ ์ดํ ๊ฒ์ ์ ํํ ํ์๊ฐ๋ง์ ๋ น์ ์์ด์ ธ ๋ฒ๋ฆฐ๋ค. ๋ฐ๋ผ์ ์๋ <๊ทธ๋ฆผ 1> ๋ชจ์๊ณผ ๊ฐ์ ์น์ฆ(ํ์์ผ๋ก ํ์๋ ๋ถ๋ถ)๋ผ๋ฉด C๋ก ํ์๋ ๋ชจ๋ ์น์ฆ ๊ฒฉ์๋ ํ ์๊ฐ ํ์ ์ฌ๋ผ์ง๋ค.
<๊ทธ๋ฆผ 1>
<๊ทธ๋ฆผ 2>์ ๊ฐ์ด ์น์ฆ ๋ด๋ถ์ ์๋ ๊ณต๊ฐ์ ์น์ฆ ์ธ๋ถ ๊ณต๊ธฐ์ ์ ์ดํ์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ค. ๊ทธ๋ฌ๋ฏ ๋ก ์ด ๊ณต๊ฐ์ ์ ์ดํ ์น์ฆ ๊ฒฉ์๋ ๋ น์ง ์๊ณ C๋ก ํ์๋ ์น์ฆ ๊ฒฉ์๋ง ์ฌ๋ผ์ง๋ค. ๊ทธ๋ฌ๋ ํ ์๊ฐ ํ, ์ด ๊ณต๊ฐ์ผ๋ก ์ธ๋ถ๊ณต๊ธฐ๊ฐ ์ ์ ๋๋ฉด <๊ทธ๋ฆผ 3>์์์ ๊ฐ์ด C๋ก ํ์๋ ์น์ฆ ๊ฒฉ์๋ค์ด ์ฌ๋ผ์ง๊ฒ ๋๋ค.
<๊ทธ๋ฆผ 2>
<๊ทธ๋ฆผ 3>
๋ชจ๋์ข ์ด์ ๋งจ ๊ฐ์ฅ์๋ฆฌ์๋ ์น์ฆ๊ฐ ๋์ด์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ค. ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์น์ฆ๊ฐ ๋ชจ๋ ๋ น์ ์์ด์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ ํํ ์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ๋ชจ๋์ข ์ด์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ๋ ๊ฐ์ ์ ์ N, M (5 โค N, M โค 100)์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ N๊ฐ์ ์ค์๋ ๋ชจ๋์ข ์ด ์์ ๊ฒฉ์์ ์น์ฆ๊ฐ ์๋ ๋ถ๋ถ์ 1๋ก ํ์๋๊ณ , ์น์ฆ๊ฐ ์๋ ๋ถ๋ถ์ 0์ผ๋ก ํ์๋๋ค. ๋ํ, ๊ฐ 0๊ณผ 1์ ํ๋์ ๊ณต๋ฐฑ์ผ๋ก ๋ถ๋ฆฌ๋์ด ์๋ค.
์ถ๋ ฅ
์ถ๋ ฅ์ผ๋ก๋ ์ฃผ์ด์ง ์น์ฆ๊ฐ ๋ชจ๋ ๋ น์ ์์ด์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ ํํ ์๊ฐ์ ์ ์๋ก ์ฒซ ์ค์ ์ถ๋ ฅํ๋ค.
๐ํ์ด
์ธ๋ถ ๊ณต๊ธฐ์ธ์ง ์๋์ง ํ๋ณํ๋ ํจ์๋ก BFS๋ฅผ ์ฌ์ฉํ๋ค.
// ๋ด๋ถ ๊ณต๊ธฐ์ธ์ง ํ๋จํ๊ธฐ
void BFS2(int y, int x)
{
queue<pair<int, int>> q;
q.push({ y, x });
isInAir[y][x] = 1;
pair<int, int> here;
while (q.empty() == false)
{
here = q.front();
q.pop();
for (int i = 0; i < 4; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 1 || nx < 1 || ny > n || nx > m)
continue;
if (isInAir[ny][nx] == 1)
continue;
if (board[ny][nx] == 1)
continue;
q.push({ ny, nx });
isInAir[ny][nx] = 1;
}
}
}
์น์ฆ ๊ทธ๋ฃน์ ์์์ผํ๋ฏ๋ก ์น์ฆ๋ฅผ ์ BFS๋ฅผ ์ฌ์ฉํ๋ค.
์ง๊ธ ์๊ฐํด๋ณด๋๊น ๊ตณ์ด ์์ง ์์๋ ๋ ๊ฒ๊ฐ๋ค.
// ์น์ฆ ๊ทธ๋ฃน ๋ง๋ค๊ธฐ
void BFS(int y, int x)
{
queue<pair<int, int>> q;
if (board[y][x] == 1 && visited[y][x] == 0)
{
q.push({ y, x });
cheese.push_back({ y, x });
visited[y][x] = 1;
}
pair<int, int> here;
while (q.empty() == false)
{
here = q.front();
q.pop();
for (int i = 0; i < 8; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 1 || nx < 1 || ny > n || nx > m)
continue;
if (visited[ny][nx] == 1)
continue;
if (board[ny][nx] == 0)
continue;
q.push({ ny, nx });
cheese.push_back({ ny, nx });
visited[ny][nx] = 1;
}
}
}
๋๋ ์ด๋ ๊ฒ BFS๋ฅผ ๋ง๋ค์ด์ ์น์ฆ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌ๋ฅผ ํ๋๋ฐ board์ ๊ฐ์ด 1์ผ ๋ ๋ง๋ค ์ธ๋ถ ๊ณต๊ธฐ์ ์ผ๋งํผ ๋ฟ์์๋์ง ํ์ธํด์ ํ์ด๋ ๋ ๊ฑฐ๊ฐ๋ค.
์น์ฆ๋ฅผ ๋ น์ด๋ ํจ์๋ ์ธ๋ถ๊ณต๊ธฐ๋ฅผ ์ด๋ฏธ ํ์ ํ๊ธฐ ๋๋ฌธ์ ์น์ฆ๋ฅผ ์ํํ๋ฉด์ ์ธ๋ถ ๊ณต๊ธฐ์ ์ผ๋งํผ ๋ฟ์์๋์ง ํ์ธํ๋ค.
void meltCheese()
{
for (int i = 0; i < cheese.size(); ++i)
{
int cnt = 0;
pair<int, int> ch = cheese[i];
for (int j = 0; j < 4; ++j)
{
int ny = ch.first + dy[j];
int nx = ch.second + dx[j];
if (ny < 1 || nx < 1 || ny > n || nx > m)
continue;
if (isInAir[ny][nx] == 1 && board[ny][nx] == 0)
cnt++;
if (cnt >= 2)
{
board[ch.first][ch.second] = 0;
totalCheese--;
break;
}
}
}
}
์ต์ข ์ ์ผ๋ก solve๋ ์๋์ ๊ฐ๋ค.
void solve()
{
// ์
๋ ฅ๊ฐ ๋ฐ๊ธฐ
cin >> n >> m;
board = vector<vector<int>>(n + 1, vector<int>(m + 1));
visited = vector<vector<int>>(n + 1, vector<int>(m + 1));
isInAir = vector<vector<int>>(n + 1, vector<int>(m + 1));
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
cin >> board[i][j];
if (board[i][j] == 1)
totalCheese++;
}
}
//printBoard();
BFS2(1, 1); // ์ธ๋ถ๊ณต๊ธฐ ํ๋จ
while (true)
{
if (totalCheese == 0)
{
cout << res;
break;
}
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
BFS(i, j);
if (cheese.size() != 0)
{
meltCheese();
cheese.clear();
}
}
}
Clear();
BFS2(1, 1);
res++;
//printBoard();
}
}
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <queue>
using namespace std;
void solve();
void BFS(int y, int x);
void BFS2(int y, int x);
void printBoard();
void Clear();
int n, m, res = 0, totalCheese = 0;
int dy[] = { -1, 0, 1, 0, -1, 1, 1, -1 };
int dx[] = { 0, 1, 0, -1, 1, 1, -1, -1 };
vector<vector<int>> board;
vector<vector<int>> isInAir; // 1์ด๋ฉด ์ธ๋ถ ๊ณต๊ธฐ 0์ด๋ฉด ๋ด๋ถ ๊ณต๊ธฐ
vector<vector<int>> visited;
vector<pair<int, int>> cheese;
// ์ธ๋ถ๊ณต๊ธฐ์ธ์ง ๋ด๋ถ๊ณต๊ธฐ์ธ์ง
// ์ ์ด๋ฉด์ ํ์ธํ๋๊ฒ.
// ์น์ฆ ๊ทธ๋ฃน๋ง๋ค๊ธฐ
// ์น์ฆ ๊ทธ๋ฃน ๋ง๋ค๊ธฐ
void BFS(int y, int x)
{
queue<pair<int, int>> q;
if (board[y][x] == 1 && visited[y][x] == 0)
{
q.push({ y, x });
cheese.push_back({ y, x });
visited[y][x] = 1;
}
pair<int, int> here;
while (q.empty() == false)
{
here = q.front();
q.pop();
for (int i = 0; i < 8; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 1 || nx < 1 || ny > n || nx > m)
continue;
if (visited[ny][nx] == 1)
continue;
if (board[ny][nx] == 0)
continue;
q.push({ ny, nx });
cheese.push_back({ ny, nx });
visited[ny][nx] = 1;
}
}
}
// ๋ด๋ถ ๊ณต๊ธฐ์ธ์ง ํ๋จํ๊ธฐ
void BFS2(int y, int x)
{
queue<pair<int, int>> q;
q.push({ y, x });
isInAir[y][x] = 1;
pair<int, int> here;
while (q.empty() == false)
{
here = q.front();
q.pop();
for (int i = 0; i < 4; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 1 || nx < 1 || ny > n || nx > m)
continue;
if (isInAir[ny][nx] == 1)
continue;
if (board[ny][nx] == 1)
continue;
q.push({ ny, nx });
isInAir[ny][nx] = 1;
}
}
}
void Clear()
{
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
isInAir[i][j] = 0;
visited[i][j] = 0;
}
}
}
void meltCheese()
{
for (int i = 0; i < cheese.size(); ++i)
{
int cnt = 0;
pair<int, int> ch = cheese[i];
for (int j = 0; j < 4; ++j)
{
int ny = ch.first + dy[j];
int nx = ch.second + dx[j];
if (ny < 1 || nx < 1 || ny > n || nx > m)
continue;
if (isInAir[ny][nx] == 1 && board[ny][nx] == 0)
cnt++;
if (cnt >= 2)
{
board[ch.first][ch.second] = 0;
totalCheese--;
break;
}
}
}
}
void printBoard()
{
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
cout << board[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
void solve()
{
// ์
๋ ฅ๊ฐ ๋ฐ๊ธฐ
cin >> n >> m;
board = vector<vector<int>>(n + 1, vector<int>(m + 1));
visited = vector<vector<int>>(n + 1, vector<int>(m + 1));
isInAir = vector<vector<int>>(n + 1, vector<int>(m + 1));
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
cin >> board[i][j];
if (board[i][j] == 1)
totalCheese++;
}
}
//printBoard();
BFS2(1, 1); // ์ธ๋ถ๊ณต๊ธฐ ํ๋จ
while (true)
{
if (totalCheese == 0)
{
cout << res;
break;
}
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
BFS(i, j);
if (cheese.size() != 0)
{
meltCheese();
cheese.clear();
}
}
}
Clear();
BFS2(1, 1);
res++;
//printBoard();
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen("input.txt", "rt", stdin);
solve();
return 0;
}