BOJ 16234. ์ธ๊ตฌ ์ด๋
๐โโ๏ธ[Gold IV] ์ธ๊ตฌ ์ด๋ - 16234
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2156 KB, ์๊ฐ: 104 ms
๋ถ๋ฅ
๋๋น ์ฐ์ ํ์, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ๊ตฌํ, ์๋ฎฌ๋ ์ด์
์ ์ถ ์ผ์
2024๋ 2์ 2์ผ 12:35:23
๋ฌธ์ ์ค๋ช
NรNํฌ๊ธฐ์ ๋ ์ด ์๊ณ , ๋ ์ 1ร1๊ฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ๊ฐ์ ๋ ์๋ ๋๋ผ๊ฐ ํ๋์ฉ ์กด์ฌํ๋ฉฐ, rํ c์ด์ ์๋ ๋๋ผ์๋ A[r][c]๋ช ์ด ์ด๊ณ ์๋ค. ์ธ์ ํ ๋๋ผ ์ฌ์ด์๋ ๊ตญ๊ฒฝ์ ์ด ์กด์ฌํ๋ค. ๋ชจ๋ ๋๋ผ๋ 1ร1 ํฌ๊ธฐ์ด๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ๊ตญ๊ฒฝ์ ์ ์ ์ฌ๊ฐํ ํํ์ด๋ค.
์ค๋๋ถํฐ ์ธ๊ตฌ ์ด๋์ด ์์๋๋ ๋ ์ด๋ค.
์ธ๊ตฌ ์ด๋์ ํ๋ฃจ ๋์ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋๊ณ , ๋ ์ด์ ์๋ ๋ฐฉ๋ฒ์ ์ํด ์ธ๊ตฌ ์ด๋์ด ์์ ๋๊น์ง ์ง์๋๋ค.
- ๊ตญ๊ฒฝ์ ์ ๊ณต์ ํ๋ ๋ ๋๋ผ์ ์ธ๊ตฌ ์ฐจ์ด๊ฐ L๋ช ์ด์, R๋ช ์ดํ๋ผ๋ฉด, ๋ ๋๋ผ๊ฐ ๊ณต์ ํ๋ ๊ตญ๊ฒฝ์ ์ ์ค๋ ํ๋ฃจ ๋์ ์ฐ๋ค.
- ์์ ์กฐ๊ฑด์ ์ํด ์ด์ด์ผํ๋ ๊ตญ๊ฒฝ์ ์ด ๋ชจ๋ ์ด๋ ธ๋ค๋ฉด, ์ธ๊ตฌ ์ด๋์ ์์ํ๋ค.
- ๊ตญ๊ฒฝ์ ์ด ์ด๋ ค์์ด ์ธ์ ํ ์นธ๋ง์ ์ด์ฉํด ์ด๋ํ ์ ์์ผ๋ฉด, ๊ทธ ๋๋ผ๋ฅผ ์ค๋ ํ๋ฃจ ๋์์ ์ฐํฉ์ด๋ผ๊ณ ํ๋ค.
- ์ฐํฉ์ ์ด๋ฃจ๊ณ ์๋ ๊ฐ ์นธ์ ์ธ๊ตฌ์๋ (์ฐํฉ์ ์ธ๊ตฌ์) / (์ฐํฉ์ ์ด๋ฃจ๊ณ ์๋ ์นธ์ ๊ฐ์)๊ฐ ๋๋ค. ํธ์์ ์์์ ์ ๋ฒ๋ฆฐ๋ค.
- ์ฐํฉ์ ํด์ฒดํ๊ณ , ๋ชจ๋ ๊ตญ๊ฒฝ์ ์ ๋ซ๋๋ค.
๊ฐ ๋๋ผ์ ์ธ๊ตฌ์๊ฐ ์ฃผ์ด์ก์ ๋, ์ธ๊ตฌ ์ด๋์ด ๋ฉฐ์น ๋์ ๋ฐ์ํ๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N, L, R์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 50, 1 โค L โค R โค 100)
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฐ ๋๋ผ์ ์ธ๊ตฌ์๊ฐ ์ฃผ์ด์ง๋ค. rํ c์ด์ ์ฃผ์ด์ง๋ ์ ์๋ A[r][c]์ ๊ฐ์ด๋ค. (0 โค A[r][c] โค 100)
์ธ๊ตฌ ์ด๋์ด ๋ฐ์ํ๋ ์ผ์๊ฐ 2,000๋ฒ ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ธ๊ตฌ ์ด๋์ด ๋ฉฐ์น ๋์ ๋ฐ์ํ๋์ง ์ฒซ์งธ ์ค์ ์ถ๋ ฅํ๋ค.
๐ํ์ด
๋ก์ง์ ๋ฌธ์ ์์ ์ฃผ์ด์ง ๊ทธ๋๋ก ๊ตฌํํ๋ฉด ๋๋ค.
- ๊ตญ๊ฒฝ์ ์ ์ฐ๋ค.
- ๋ชจ๋ ๊ตญ๊ฒฝ์ ์ ์ด์์ผ๋ฉด ์ฐํฉ์ ๋ง๋ ๋ค.
- ์ฐํฉ์ ํด์ฒดํ๊ณ ๊ตญ๊ฒฝ์ ์ ๋ซ๋๋ค.
์ฌ๊ธฐ์ ๊ตญ๊ฒฝ์ ์ ์ฌ๋ ๋ฐฉ๋ฒ์ BFS๋ฅผ ์ด์ฉํ๋ค.
๋จผ์ ์ ๋ ฅ๊ฐ์ ๋ฐ์ ์ธํ ์ํ๋ค.
cin >> N >> L >> R;
board = vector<vector<int>>(N + 1, vector<int>(N + 1));
discovered = vector<vector<int>>(N + 1, vector<int>(N + 1));
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
cin >> board[i][j];
}
}
BFS๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
void BFS(pair<int, int> here)
{
q.push(here);
discovered[here.first][here.second] = 1;
// ๊ตญ๊ฒฝ์ ์ด๊ธฐ
while (q.empty() == false)
{
here = q.front();
q.pop();
if (flag != true)
flag = false;
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 > N)
continue;
if (discovered[ny][nx] == 1)
continue;
// ๊ตญ๊ฒฝ์ ์ ์ด ์กฐ๊ฑด์ด ๋๋์ง ํ์ธ.
int diff = abs(board[here.first][here.second] - board[ny][nx]);
if (diff < L || diff > R)
continue;
q.push({ ny, nx });
v.push_back({ ny, nx });
discovered[ny][nx] = 1;
sum += board[ny][nx]; // ๋์ค์ ํ๊ท ๋ด๊ธฐ ์ํ ํฉ
}
}
}
๋์ด์ ์ฐํฉ์ด ๋ง๋ค์ด์ง์ง ์์ ๋ ๊น์ง ๋ฐ๋ณตํด์ผํ๋ค.
while (true)
{
if (flag == false)
break;
// ํ๋๊ทธ ๊บผ์ฃผ๊ณ ์ฐํฉ์๊ธฐ๋ฉด true
flag = false;
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
if (discovered[i][j] == 0)
{
// ๋ฒกํฐ ๋น์์ฃผ๊ณ ํ์ฌ ์์น๋ ์ฑ์์ฃผ๊ธฐ
v.clear();
v.push_back({ i, j });
// ํฉ๋ ์ฒ์๊ฐ ๋ฃ์ด์ฃผ๊ธฐ
sum = board[i][j];
BFS({ i, j });
}
// ์ฐํฉ์ด ๋ฐ์ํ๋ค๋ ๋ป
if (v.size() >= 2)
{
flag = true;
int vSize = v.size();
// ํ๊ท ๊ฐ ์ ์ฉํ๊ธฐ.
for (int i = 0; i < vSize; ++i)
{
board[v[i].first][v[i].second] = sum / vSize;
}
}
}
}
// ๋ฌธ์ ๊ฐ ๋ฉฐ์น ์ด ์ง๋ฌ๋์ง ๋ฌผ์์ผ๋ฏ๋ก ํ๋ฐํด ๋ค ๋๊ณ res๋ฅผ ์ฆ๊ฐํด์ผ๋จ.
if (flag)
res++;
// ์ฐํฉ ํด์ฒดํ๊ณ ๊ตญ๊ฒฝ์ ๋ซ๊ธฐ
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
discovered[i][j] = 0;
}
}
}
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int N, L, R, res = 0;
vector<vector<int>> board;
vector<vector<int>> discovered;
vector<pair<int, int>> v;
queue<pair<int, int>> q;
int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
bool flag = true;
int sum = 0;
void BFS(pair<int, int> here)
{
q.push(here);
discovered[here.first][here.second] = 1;
// ๊ตญ๊ฒฝ์ ์ด๊ธฐ
while (q.empty() == false)
{
here = q.front();
q.pop();
if (flag != true)
flag = false;
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 > N)
continue;
if (discovered[ny][nx] == 1)
continue;
int diff = abs(board[here.first][here.second] - board[ny][nx]);
if (diff < L || diff > R)
continue;
q.push({ ny, nx });
v.push_back({ ny, nx });
discovered[ny][nx] = 1;
sum += board[ny][nx];
}
}
}
void solve()
{
cin >> N >> L >> R;
board = vector<vector<int>>(N + 1, vector<int>(N + 1));
discovered = vector<vector<int>>(N + 1, vector<int>(N + 1));
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
cin >> board[i][j];
}
}
// ๋ก์ง
// 1. ๊ตญ๊ฒฝ์ ์ ์ฐ๋ค.
// 2. ๋ชจ๋ ๊ตญ๊ฒฝ์ ์ ์ด์์ผ๋ฉด ์ฐํฉ์ ๋ง๋ ๋ค.
// 3. ์ฐํฉ์ ํด์ฒดํ๊ณ ๊ตญ๊ฒฝ์ ์ ๋ซ๋๋ค.
// BFS?
while (true)
{
if (flag == false)
break;
flag = false;
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
if (discovered[i][j] == 0)
{
v.clear();
v.push_back({ i, j });
sum = board[i][j];
BFS({ i, j });
}
if (v.size() >= 2)
{
flag = true;
int vSize = v.size();
for (int i = 0; i < vSize; ++i)
{
board[v[i].first][v[i].second] = sum / vSize;
}
}
}
}
if (flag)
res++;
// ์ฐํฉ ํด์ฒดํ๊ณ ๊ตญ๊ฒฝ์ ๋ซ๊ธฐ
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
discovered[i][j] = 0;
}
}
}
cout << res;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
solve();
return 0;
}