Tags
- ์๋ฃ๊ตฌ์กฐ
- ๊ทธ๋ํ ์ด๋ก
- ๋๋น ์ฐ์ ํ์
- Brute Force Algorithm
- LV2
- ์ํ
- ์๋ฎฌ๋ ์ด์
- stack
- dfs
- Study
- Python
- ๋ฌธ์์ด
- ์ ๋ ฌ
- ๊ตฌํ
- Java
- BFS
- BOJ
- DP
- ๋ฐฑํธ๋ํน
- greedy
- ๊ต์ฌ
- Dynamic Programming
- CodingTest
- sort
- ๊ทธ๋ํ ํ์
- SpringBoot
- PGM
- queue
- ์ ์๋ก
- ๊น์ด ์ฐ์ ํ์
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_16234 : ์ธ๊ตฌ ์ด๋ ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- ๋ ํฌ๊ธฐ(N)์ ์ธ๊ตฌ ์ต์, ์ต๋๊ฐ(L,R)์ด ์ฃผ์ด์ง๊ณ , 2์ฐจ์ ๋ฐฐ์ด ํํ์ ์ธ๊ตฌ์๊ฐ ์ฃผ์ด์ง๋ค.
- ์ธ๊ตฌ์์ ์ฐจ์ด๊ฐ L, R ๊ฐ ์ฌ์ด๋ผ๋ฉด, ๊ตญ๊ฒฝ์ ์ ์ฐ๋ค.
- ๊ตญ๊ฒฝ์ ์ด ์ด๋ ค์ ํตํ์ด ๊ฐ๋ฅํ ๋๋ผ๋ค์ ํ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๋๋ค.
- ํ ๊ทธ๋ฃน์ ํ๊ท ์ธ๊ตฌ์๋ฅผ ๊ทธ๋ฃน๋ด ๋ชจ๋ ์นธ์ ์ฑ์ด๋ค. (์ธ๊ตฌ๋ฅผ ํ์คํํ๋ค)
- ์ด ํ์คํ ์์ ์ BFS๋ก ๊ตฌํํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
- ๊ตญ๊ฒฝ์ ์ด ํ ๊ณณ์ด๋ผ๋ ์ด๋ ธ๋ค๋ฉด, ์ธ๊ตฌ ์ด๋์ด ์์ผ๋ฏ๋ก ํ๋ฃจ๊ฐ ์ง๋์ผ ํ๋ค.
๐ธ ์ฝ๋ ๐ธ
#include<iostream>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
int BFS(vector<vector<int>>& A, int& i, int& j, vector<vector<int>>& group,
int& G_count, int& L, int& R, vector<vector<int>>& same_G_list) {
int sum = 0;
queue<vector<int>> q;
vector<int> pair(2);
pair[0] = i;
pair[1] = j;
q.push(pair);
group[i][j] = G_count;
while (!q.empty()) {
pair = q.front();
int now_i = pair[0];
int now_j = pair[1];
sum += A[now_i][now_j];
same_G_list[G_count].push_back(now_i);
same_G_list[G_count].push_back(now_j);
//printf("pair[0] : %d pair[1] : %d G_count : %d\n", pair[0], pair[1], G_count);
// left
int next_i = now_i;
int next_j = now_j - 1;
if (next_j >= 0 && group[next_i][next_j] == 0
&& abs(A[now_i][now_j] - A[next_i][next_j]) >= L
&& abs(A[now_i][now_j] - A[next_i][next_j]) <= R) {
pair[0] = next_i;
pair[1] = next_j;
q.push(pair);
group[next_i][next_j] = G_count;
}
//top
next_i = now_i - 1;
next_j = now_j;
if (next_i >= 0 && group[next_i][next_j] == 0
&& abs(A[now_i][now_j] - A[next_i][next_j]) >= L
&& abs(A[now_i][now_j] - A[next_i][next_j]) <= R) {
pair[0] = next_i;
pair[1] = next_j;
q.push(pair);
group[next_i][next_j] = G_count;
}
//right
next_i = now_i;
next_j = now_j + 1;
if (next_j < A.size() && group[next_i][next_j] == 0
&& abs(A[now_i][now_j] - A[next_i][next_j]) >= L
&& abs(A[now_i][now_j] - A[next_i][next_j]) <= R) {
pair[0] = next_i;
pair[1] = next_j;
q.push(pair);
group[next_i][next_j] = G_count;
}
//bottom
next_i = now_i + 1;
next_j = now_j;
if (next_i < A.size() && group[next_i][next_j] == 0
&& abs(A[now_i][now_j] - A[next_i][next_j]) >= L
&& abs(A[now_i][now_j] - A[next_i][next_j]) <= R) {
pair[0] = next_i;
pair[1] = next_j;
q.push(pair);
group[next_i][next_j] = G_count;
}
q.pop();
}
return sum;
}
int main(void) {
int N, L, R, day = -1, G_count;
cin >> N >> L >> R;
vector<vector<int>> A(N, vector<int>(N, 0));
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
cin >> A[i][j];
bool flag = true;
while (flag) {
flag = false;
vector<vector<int>> group(N, vector<int>(N, 0)); // ์์ ๊ทธ๋ฃน
vector<int> groupSum(N * N + 1, 0);
vector<vector<int>> same_G_list(N * N + 1, vector<int>());
G_count = 0;
// ๋ชจ๋ ๋๋ผ๋ฅผ ๋ฐฉ๋ฌธํ๋ฉฐ BFS ์ค๋น
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (group[i][j] == 0) { // ์์ ๊ทธ๋ฃน์ด ์๋ค๋ฉด BFS ์์
G_count++;
groupSum[G_count] = BFS(A, i, j, group,
G_count, L, R, same_G_list);
if (groupSum[G_count] > A[i][j])
flag = true;
// flag = true๋ฉด ๋ค์ ๋ ๊ฒ์ฌ๋ฅผ ๋ค์ ํด์ผํจ
}
}
}
// ๊ทธ๋ฃน ํ๊ท ์ฒ๋ฆฌ
for (int g = 1; g <= G_count; g++)
{
int size = same_G_list[g].size();
int avg = groupSum[g] / (size / 2);
for (int c = 0; c < size; c+=2)
{
A[same_G_list[g][c]][same_G_list[g][c + 1]] = avg;
}
}
day++;
}
cout << day;
return 0;
}
๐ธ ์ฝ๋ ํด์ ๐ธ
์ฝ๋๊ฐ ๊ฝค ๊ธธ๊ณ ๋ณต์กํ๋ฏ๋ก ๋์ด์ ์ค๋ช ํ๋ค.
๋จผ์ mainํจ์์ while๋ฌธ ๊ฒ ๋ถ๋ถ์ด๋ค.
int main(void) {
int N, L, R, day = -1, G_count;
cin >> N >> L >> R;
vector<vector<int>> A(N, vector<int>(N, 0));
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
cin >> A[i][j];
bool flag = true;
while (flag) {
// ์๋ต
}
cout << day;
return 0;
}
- N, L, R, A ๋ ๋ฌธ์ ์ ์ ์์ ๊ฐ๋ค. (A๋ vector๋ฅผ ์ค์ฒฉํด์ ์ฌ์ฉํ๋ค)
- day : ์ธ๊ตฌ ์ด๋์ด ์ผ์ด๋๋ ์ผ์ ์
- G_count : ๊ทธ๋ฃน ๋ฒํธ๋ฅผ ๋งค๊ธฐ๊ธฐ ์ํ ๋ณ์ (1~N*N)
- flag : while๋ฌธ ๋ด์์ ๊ตญ๊ฒฝ์ ์ด ์ด๋ฆฌ๋ฉด true
๋ค์์ while๋ฌธ ์์ชฝ์ด๋ค.
while (flag) {
flag = false;
vector<vector<int>> group(N, vector<int>(N, 0)); // ์์ ๊ทธ๋ฃน
vector<int> groupSum(N * N + 1, 0);
vector<vector<int>> same_G_list(N * N + 1, vector<int>());
G_count = 0;
// ๋ชจ๋ ๋๋ผ๋ฅผ ๋ฐฉ๋ฌธํ๋ฉฐ BFS ์ค๋น
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (group[i][j] == 0) { // ์์ ๊ทธ๋ฃน์ด ์๋ค๋ฉด BFS ์์
G_count++;
groupSum[G_count] = BFS(A, i, j, group,
G_count, L, R, same_G_list);
if (groupSum[G_count] > A[i][j])
flag = true;
// flag = true๋ฉด ๋ค์ ๋ ๊ฒ์ฌ๋ฅผ ๋ค์ ํด์ผํจ
}
}
}
// ๊ทธ๋ฃน ํ๊ท ์ฒ๋ฆฌ
for (int g = 1; g <= G_count; g++)
{
int size = same_G_list[g].size();
int avg = groupSum[g] / (size / 2);
for (int c = 0; c < size; c+=2)
{
A[same_G_list[g][c]][same_G_list[g][c + 1]] = avg;
}
}
day++;
}
- flag๋ ๋ฐ๋ก false๋ก ๋ฐ๊ฟ์ฃผ๊ณ ๊ตญ๊ฒฝ์ ์ด ์ด๋ฆฐ๊ฒ ํ์ธ๋๋ฉด true๋ก ๋ฐ๊พผ๋ค.
- group : BFS์ ๋ฐฉ๋ฌธ ํ์ธ์ฉ ๋ฆฌ์คํธ ๊ฒธ, ์์๋ ๊ทธ๋ฃน์ ๊ธฐ๋กํ๋ vector ์ด๋ค. ( 0์ด๋ฉด ๋ฏธ๋ฐฉ๋ฌธ )
- groupSum : ๊ฐ ๊ทธ๋ฃน ๋ณ ํ๊ท ์ ๊ตฌํ๊ธฐ ์ํด ์ด ํฉ์ ๊ธฐ๋กํ๋ vector ์ด๋ค. ( ์ต๋ ๊ฐ์ G_count์ ์ต๋๊ฐ์ธ N*N )
- same_G_list : ๊ฐ์ ๊ทธ๋ฃน์ ์ขํ๋ฅผ ๊ธฐ๋กํ vector์ด๋ค.
( i, j๋ฅผ ์์๋๋ก ๋ฃ๋๋ค. 3์ค์ฒฉ์ ์๋๊ณ pair๋ฅผ ๊ตณ์ด ๋ฃ๊ณ ์ถ์ง ์์์... ) - ์ฒซ 2์ค for๋ฌธ์ ๋๋ผ๋ค์ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๋ฉฐ ๊ทธ๋ฃน์ ์ํ์ง ์์ ๊ณณ์ BFS์ ์์์ ์ผ๋ก ์ผ๋ ๋ฐ๋ณต๋ฌธ์ด๋ค.
- BFS์ ๋ฐํ๊ฐ์ผ๋ก ํ ๊ทธ๋ฃน์ ์ด ํฉ์ ๋ฐ๋๋ฐ, ์์ ๋๋ผ์ ๊ฐ๋ค๋ฉด ๊ทธ๋ฃน์ ๋๋ผ๊ฐ 1๊ฐ์ธ ๊ฒ ์ด๋ฏ๋ก ๊ตญ๊ฒฝ์ ์ด ์ด๋ฆฌ์ง ์์๋ค๊ณ ํ๋จํ๋ค.
- ์๋๋ void๋ bool๊ฐ์ ๋ฐํํ๋ ์์ผ๋ก ์งฐ๋๋ฐ ๋ง์ง๋ง ํ๊ท ๊ฐ ์ฒ๋ฆฌ์์ ์๊ฐ์ ๋จ์ถํ๊ธฐ ์ํด sum๊ณผ list๋ฅผ ์ถ๊ฐํ๋ค ๋ณด๋ ์ด๋ฐ์์ผ๋ก ๋ฐ๋์๋ค.
- ๋๋ฒ์งธ 2์ค for๋ฌธ์ ๊ทธ๋ฃน๋ค์ ๊ฐ ํ๊ท ๊ฐ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ๋ถ๋ถ์ด๋ค.
- ์๋์ฝ๋๋ ๋ชจ๋ ๋๋ผ๋ฅผ 1~G_count ๊น์ง ๋๋ ค๊ฐ๋ฉฐ ๋ฐฉ๋ฌธํ๊ณ ํ๊ท ๊ฐ ์ฒ๋ฆฌ๋ฅผ ํ๋๋ฐ, ๋ฐ๋ณต ํ์๊ฐ ๋๋ฌด ๋ง์์ ธ์ ์๊ฐ์ด๊ณผ๊ฐ ๋ด๊ณ , ์์ ๊ฐ์ด ์ดํฉ๊ณผ list๋ฅผ ๊ฐ๋กํ๋๋ก ๋ณ๊ฒฝํ๋ค.
- ๋๋ผ์ ์ขํ 2๊ฐ๋ฅผ ์์๋๋ก ๋ฃ์์ผ๋ฏ๋ก 2์ฉ ๋๋ ค๊ฐ๋ฉฐ ํ๊ท ๊ฐ์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
๋ค์์ BFS ํจ์์ด๋ค.
int BFS(vector<vector<int>>& A, int& i, int& j, vector<vector<int>>& group,
int& G_count, int& L, int& R, vector<vector<int>>& same_G_list) {
int sum = 0;
queue<vector<int>> q;
vector<int> pair(2);
pair[0] = i;
pair[1] = j;
q.push(pair);
group[i][j] = G_count;
while (!q.empty()) {
pair = q.front();
int now_i = pair[0];
int now_j = pair[1];
sum += A[now_i][now_j];
same_G_list[G_count].push_back(now_i);
same_G_list[G_count].push_back(now_j);
//printf("pair[0] : %d pair[1] : %d G_count : %d\n", pair[0], pair[1], G_count);
// left
int next_i = now_i;
int next_j = now_j - 1;
if (next_j >= 0 && group[next_i][next_j] == 0
&& abs(A[now_i][now_j] - A[next_i][next_j]) >= L
&& abs(A[now_i][now_j] - A[next_i][next_j]) <= R) {
pair[0] = next_i;
pair[1] = next_j;
q.push(pair);
group[next_i][next_j] = G_count;
}
//top
next_i = now_i - 1;
next_j = now_j;
if (next_i >= 0 && group[next_i][next_j] == 0
&& abs(A[now_i][now_j] - A[next_i][next_j]) >= L
&& abs(A[now_i][now_j] - A[next_i][next_j]) <= R) {
pair[0] = next_i;
pair[1] = next_j;
q.push(pair);
group[next_i][next_j] = G_count;
}
//right
next_i = now_i;
next_j = now_j + 1;
if (next_j < A.size() && group[next_i][next_j] == 0
&& abs(A[now_i][now_j] - A[next_i][next_j]) >= L
&& abs(A[now_i][now_j] - A[next_i][next_j]) <= R) {
pair[0] = next_i;
pair[1] = next_j;
q.push(pair);
group[next_i][next_j] = G_count;
}
//bottom
next_i = now_i + 1;
next_j = now_j;
if (next_i < A.size() && group[next_i][next_j] == 0
&& abs(A[now_i][now_j] - A[next_i][next_j]) >= L
&& abs(A[now_i][now_j] - A[next_i][next_j]) <= R) {
pair[0] = next_i;
pair[1] = next_j;
q.push(pair);
group[next_i][next_j] = G_count;
}
q.pop();
}
return sum;
}
- BFS ๋ถ๋ถ์ main() ์์ ๊ตฌํํ๋ฉด ๋๋ฌด ๊ผฌ์ผ ๊ฒ ๊ฐ์ ํจ์๋ก ๋ถ๋ฆฌํ๋ค.
(ํ์ํ ์ธ์๋ฅผ ๋งค๊ฐ๋ณ์์ ์ ๋ถ ๋ฃ๊ฒ๋์ ์ข ์ง์ ๋ถํด์ก๋ค...) - ํ์ฌ ์ขํ์ ๊ทธ๋ฃน ์ดํฉ์ ๋ํด์ฃผ๊ณ , ๊ทธ๋ฃน ๋ชฉ๋ก์๋ ์ถ๊ฐํ๋ค.
- ํ์ฌ ์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ, ์์ชฝ, ์ค๋ฅธ์ชฝ, ์๋์ชฝ์ ํ์ํ๋ค.
- vector ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๋์ง ํ์ธํ๋ค.
- group[][] == 0 : ๋ฐฉ๋ฌธํ์ง ์์๋ (๊ทธ๋ฃน์ด ์๋) ๋๋ผ์ธ์ง ํ์ธํ๋ค.
- L ~ R ๋ฒ์ ๋ด์ธ์ง ํ์ธํ๋ค.
- ์ขํ๋ฅผ ํ์ ๋ฃ๊ณ , ๊ทธ๋ฃน๋ ํ์ํ๋ค.
๐ธ end ๐ธ
- BFS๋ฅผ ์ ์ฉํด๋ณด๋ ์๊ฐ๋ณด๋ค ๋ผ๋๋ฅผ ์ฝ๋ฉํ๋ ๊ฑด ์ค๋๊ฑธ๋ฆฌ์ง ์์๋ค.
- ์์ํ ์ค๋ฅ๊ฐ ๋ง์๊ณ , ์๊ฐ์ด๊ณผ๋ฅผ ํด๊ฒฐํ๋๊ฒ ์กฐ๊ธ ํ๋ค์๋ค.
- ํ์ด ๊ณผ์ ์ฌ์ง์ฒ๋ผ ์์ผ๋ก ํ์ด๋ณด๋ ๋ฌธ์ ์ดํด๊ฐ ๋น ๋ฅด๊ฒ ๋์๋ค.
728x90