: ๋ฐฑํธ๋ํน.
-> ๊ด๊ฑด์ผ๋ก๋ ๋ชจ๋ ์ธ๋ฑ์ค ์ ๊ทผํด์ผ ํ๋๋ฐ, 2์ค for๋ฌธ์ ์ด๋ป๊ฒ ์์ฑํ ๊ฒ์ด๋ ์ด๋ค!
: ๋ฌธ์ ๋ฅผ ์ฝ์ด๋ณด๋ฉด,
1. 3๊ฐ์ ๋ฒฝ์ ๋ง๋ค๊ธฐ
2. bfs ๋๊ธฐ์ด๋ค.
0 0 0
1 0 0 ์ผ ๊ฒฝ์ฐ ์ด๋ฐ์์ผ๋ก ๋ฒฝ์ ์ฌ๊ท์ ์ผ๋ก ์ธ์๋๊ฐ์ผ ํ๋ค.
- 1 1 1
1 0 0- 1 1 0
1 1 0- 1 1 0
1 0 1- 1 0 1
1 1 0- 1 0 1
1 0 1- 1 0 0
1 1 0- 1 0 0
1 0 1
์ถ๋ ฅ ๊ฒฐ๊ณผ
: ์๋ชป๋์๋ค.
1 1 0
1 0 1
๋ค์์๋
1 0 1
1 1 0 ์ด ๋์์ผ ํ๋๋ฐ....
1 0 1
1 0 1 ์ด ๋์๋ค....
์ ํ๋ ธ์๊น?
: ์๋์ ์ํ 2์ค for๋ฌธ์ ๋ณด๋ฉด, ์ธ์๋ก ๋ค์ด์ค๋ _y์ _x๋ ์๋ณต์ด ๋ถ๊ฐํ๋ค.
-> ์ ์์ ์ด ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ฒ ํ๋ ค๋ฉด 2์ค for๋ฌธ์ 0,0์ผ๋ก ํด์ผ ํ๋ค๋ ๊ฒ์ ์ ์ ์์ง๋ง.
์ด๋ ๊ฒ ๋ณ๊ฒฝํด์ผ ํ๋ค.
: 2์ค for๋ฌธ์ ์ธ์๋ก ๋ณด๋ธ ๊ฐ์ผ๋ก ์งํํ๋ฉด ๊ฒฐ๊ตญ์๋ ๋ชจ๋ ์ ์ ์ ๋ํ ํ์์ด ๋ถ๊ฐํ๋ค.
์๊ฐ์ ์ํด์ผ ํ๋ค.
-> ์๋ชป๋ 2์ค for๋ฌธ์ผ๋ก ์์ฑํ๊ฒ ๋๋ฉด ๊ณ์ํด์ ์ ์ ์ ์ธ๋ฑ์ค๊ฐ ์ปค์ง๊ฒ ๋์, ์์๋๋ ์ธ๋ฑ์ค์ ์ ์ ์ ์์ ๊ฐ์ผ๋ก ํ ์ ์๋ค๋ ๊ฒ์ ์๊ฐํด์ผ ํ๋ค.
3๊ฐ ๋ฒฝ์ ์์ ๋ค์์ ์๋ณตํด์ ์ด์ ์ ์ ์ ๋ค์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ๊ณ ์ฐฐ์ ํด์ผ ํ๋ค.
: 220909 11:53 ~ 12:53
- ์ฝ๋๊ฐ ๊ธธ์ด์ ๊ตฌํํ๊ณ ์ ํ๋ ํจ์๋ฅผ
์ฌ๋ฌ๊ฐ ๋ง๋ค๋ฉด์ ์ฒ๋ฆฌํ ๊ธฐ๋ฅ์ ๋ค๋ฅธ ๊ณณ์
์์ฑํ ์ ์์.
-> ์ฃผํ์ ๋ง์ ๋น ์ง์ง ๋ง๊ณ , ๋ฉ๋ถ ํ์ง ๋ง์.
- ํด๋น ํจ์๋ฅผ ์์ฑํ๊ธฐ ์ ์ , ์ฃผ์์ผ๋ก
๋ฏธ๋ฆฌ ๊ธฐ๋ฅ์ ๋ํ ์ ์๋ฅผ ํ๊ณ , ํ์ํ ๊ธฐ๋ฅ๋ง ์์ฑํ์.
http://boj.kr/16c64f66db4141af873fbacf22f94474
: ํ์ฐ์ด ๋ชจ๋ ์๋ฃ๋ ์ดํ์ 0์ธ ๋ถ๋ถ์ ๊ณ์ฐํด์ผ ํ๋๋ฐ
, bfs ํจ์ ์์์ 0์ธ ๋ถ๋ถ์ ๊ณ์ฐํด๋ฒ๋ ธ์....
: ๋ฐฑํธ๋ํน, ์์ ํ์
#include <iostream>
using namespace std;
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
//09:18
int n, m;
int cnt = 0;
// ์ํ์ข์ฐ
int dx[]{ 0,0,-1,1 };
int dy[]{ -1,1,0,0 };
int res = 0;
void bfs(vector<vector<int>>&_v , int _y, int _x)
{
//if (_v[_y][_x] == 1)
// return;
queue<pair<int, int>>q;
q.push(make_pair(_y, _x));
while (!q.empty())
{
int curY = q.front().first;
int curX = q.front().second;
q.pop();
for (int i = 0; i < 4; ++i)
{
//์ํ์ข์ฐ๋ฅผ ํ์ธํจ
int nY = curY + dy[i];
int nX = curX + dx[i];
// ํ
ํฌ๋ฆฌ ํ์ธ
if (nY < 0 || nY >= n
|| nX < 0 || nX >= m)
{
continue;
}
// ์กฐ๊ฑด ํ์ธ
if (_v[nY][nX] == 0)
{
q.push(make_pair(nY, nX));
_v[nY][nX] = 2;
}
}
}
}
// ๋ฒฝ์ 3๊ฐ ์ธ์์ผ ํจ.
// ์กฐํฉํ๋ ๋ฐฉ์์ผ๋ก ์งํํด์ผ ํ๋ฏ๋ก.
// ๋ฐฑํธ๋ํน์ผ๋ก ์ ๊ทผํด์ผ ํจ.
void backTr(vector<vector<int>>&_v )
{
// 1. ์ข
๋ฃ๋ฌธ
if (cnt == 3)
{
vector<vector<int>>temp(_v);
// ์ฌ๊ธฐ์ ๋ฐ์ด๋ฌ์ค ํ์ฐ์ ํด์ผํจ.
// 2์ธ ๊ฐ์ ์ํ์ข์ฐ๋ก ํ์ฐ์ํค์.
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
if(temp[i][j] == 2)
bfs(temp, i, j);
}
}
// ๋ชจ๋ ์์ญ ํ์ธ ํ์ ์์ ์์ญ ๋ช๊ฐ ์๋์ง๋ฅผ ํ์ธํ์.
int ccnt = 0;
// ์ต๋ ๊ฐ์๋ฅผ ํ์ธํ์.
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
if (temp[i][j] == 0)
++ccnt;
}
}
res = max(res, ccnt);
//cout << "์์ ์์ญ : ";
//cout << res << endl;
return;
}
// 2. ์ํ๊ฐ on off
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
if (_v[i][j] == 0)
{
// ๋ฒฝ์ผ๋ก ๋ง๋ฌ.
_v[i][j] = 1;
++cnt;
backTr(_v);
// ์๋ณตํจ.
_v[i][j] = 0;
--cnt;
}
}
}
}
int main()
{
cin >> n >> m;
vector<vector<int>>v(n, vector<int>(m));
vector<vector<bool>>check(n, vector<bool>(m));
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
cin >> v[i][j];
}
}
//๋ฐ์ด๋ฌ์ค ์ฆ 2๊ฐ ์กด์ฌํ๋ ์์ญ์์๋ง bfs ํจ์๋ฅผ ํธ์ถํ๊ฒ ํ์.
//
// ๋ฒฝ์ ๋จผ์ ์ธ์ด๋ค์ ๋๋ ค์ผ ํจ...
backTr(v);
cout << res << endl;
}```
## ์ฐธ๊ณ
: 3๋ฒ ์
๋ ฅ๊ฐ ๋ฃ์ ํ 20์ด ๋ค์ ์ฑ์ ๋จ.
## ํ์ด์ ๋ต
1. 64๊ฐ์ ์นธ์ค์์ 3๊ฐ๋ฅผ ์ ํํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ด๋ฏ๋ก, ์ปด๋น๋ค์ด์
์ผ๋ก
๋ํ๋ผ์ ์์. ์๊ฐ ๋ณต์ก๋ 64C3 ์ด๋ฏ๋ก
64! / (64 - 3) ! * 3!
-> 64 * 63 * 62 / 3 * 2
-> ๋์ถฉ 70 * 70 * 70 = 4900 * 70 => 350 000 ์ด๋ฏ๋ก
10 ๋ง๋ณด๋ค๋ ์ ์ผ๋ฏ๋ก ์์ ํ์์ผ๋ก ํ์ด์ผ ๊ฒ ๋ค๊ณ ํ๋จํจ!
2. ๋ฒฝ์ ๋จผ์ ์ธ์ ๋ํ์ ์นด์ดํ
์ด 3์ด ๋์์ ๋ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์ง์ ์
๊ธฐ์ค์ผ๋ก ํด์ ๋ฐ์ด๋ฌ์ค ํ์ฐ์ ํจ.
- ๊ทผ๋ฐ ์ฌ๊ธฐ์ ์๊ฐํ ๋ถ๋ถ์ด 2 ๋ค์์ 0 0 0 ์ด ๋ถ๋ถ์ ๋ฒฝ์ผ๋ก ์ธ์ ๋ค๊ณ ํ๊ณ ,
๋ฐ์ด๋ฌ์ค ์ฒ๋ฆฌ ํ์ 2 ๋ฐ๋ก ์ 0์ธ ๋ถ๋ถ์ด 1๋ก ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก ๋ค์ ์๋ณต
2 0 ์ผ๋ก ๋ง๋ค์ด์ผ ํจ.
-> ์ผ๋ฐ์ ์ธ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ง๋ค์ ์์.
- ์๋ํ๋ฉด 3์ธ ๋ถ๋ถ์์ ํ์ฐ์ ํ๋ค๊ณ ํ๊ณ , ๋ค์ 0์ผ๋ก ๋๊ณ ,
๋ค์ ์งํํด๋ณด์์, ์ด์ ์ ์นด์ดํ
๋ 2๊ฐ์ ๊ฐ์ ๊ฐฑ์ ์ด ์๋๊ธฐ ๋๋ฌธ์.
-> ์ฌ๊ท๋ฅผ ํด์ผํจ.
![](https://velog.velcdn.com/images/kwt0124/post/c1b1f663-93a5-4824-bc3c-e7e4c6f06d3f/image.png)
- ๊ทธ๋ถ๋ถ์ด ์ฌ๊ธฐ ์ฝ๋์
![](https://velog.velcdn.com/images/kwt0124/post/cb071928-2271-4fa1-9a36-6778c815bef3/image.png)
- ์นด์ดํ
์ด 3์ผ๋ ๋ฐ์ด๋ฌ์ค ํ์ฐํ๋ ๋ถ๋ถ์์ ์ข
๋ฃ๋ฌธ์ ๋๋ฆฌ๋ฉด, 3๋ฒ ์ฌ๊ท๋ ๋ถ๋ถ์์ ์ฒซ๋ฒ์งธ ์ฌ๊ทํจ์๊ฐ ๋ง์น๊ณ ๋์จ ๋ค, ๋งจ์์ ์ธ๋ฑ์ค ๋ถ๋ถ์์ ๋ค์ ์์ํ๊ฒ ๋จ.
## ์ฝ๋
#include
using namespace std;
#include
#include
int answer = 0;
int cnt = 0;
//์ ํ ์ข ์ฐ
int dx[]{ 0,0,-1,1 };
int dy[]{ -1,1,0,0 };
void dfs(vector<vector>&v, int y, int x)
{
//์ํ์ข์ฐ๋ฅผ ํ์ธํ๊ณ , 0์ผ ๊ฒฝ์ฐ์๋ง ์งํ.
for (int i = 0; i < 4; i++)
{
// ์กฐ๊ฑด ์ฒดํฌ
int ny = y + dy[i];
int nx = x + dx[i];
if (ny >= 0 && ny < v.size()
&& nx >= 0 && nx < v[0].size())
{
// ์์๊ฐ ํ์ธ.
if (v[ny][nx] == 0)
{
v[ny][nx] = 2;
//๋ณ๊ฒฝ๋ ๋ถ๋ถ์ ๋ํด์ ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ก ํด์ผํ๋ฏ๋ก
// ์ฌ๊ธฐ์ ์์ฑํจ.
// ๋ฐ๋์ ํด์ผํจ.
dfs(v,ny, nx);
}
}
}
}
void MakeWall(vector<vector>&v)
{
if (cnt == 3)
{
//๋ฐ์ด๋ฌ์ค 2์ธ ์ง์ ์์ ํ์ฐ์ด ์์๋จ.
// ์นด์ดํธ 3์ด ๋ ๋๋ง๋ค ์ฒ์๋ถํฐ ๋ฐ์ด๋ฌ์ค ํ์ฐํด์ผ ํ๋ฏ๋ก
//๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด์ ์งํํ์.
vector<vector<int>>temp(v);
for (int i = 0; i < temp.size(); i++)
{
for (int j = 0; j < temp[0].size(); j++)
{
if (temp[i][j] == 2)
{
dfs(temp, i ,j);
}
}
}
//๋ฐ์ด๋ฌ์ค ํ์ฐ ์๋ฃ ํ์ ๊ฒฐ๊ณผ๊ฐ ์นด์ดํ
0์ธ ๊ณณ์ ํ์ธ
int result = 0;
//๋ฐ์ด๋ฌ์ค ํ์ฐ ์๋ฃ ํ์ ์นด์ดํ
ํ์.
for (int i = 0; i < v.size(); i++)
{
for (int j = 0; j < v[0].size(); j++)
{
if (temp[i][j] == 0)
{
result += 1;
}
}
}
answer = max(answer, result);
return;
}
for (int i = 0; i < v.size(); i++)
{
for (int j = 0; j < v[0].size(); j++)
{
if (v[i][j] == 0)
{
v[i][j] = 1;
++cnt;
// ์์ ์ ์นด์ดํ
1,2 ๋๊ธฐ์ ์ ์ธ๋ฑ์ค๋ฅผ
// ์๋ณต์ ํด์ผ ํ๋ฏ๋ก
// ์ฌ๊ท๋ฅผ ํด์ผํจ.
MakeWall(v);
// ์ด๊ฑด ์๋๋ฏ.. : ๋ค์์๋ถํฐ ์ฑ์๋๊ฐ.
//์ฌ๊ท ์ด๋ฏ๋ก ์ธ์ ๋๋ผ์ง๋ฅผ ๋ง๋ค์ด์ผ ํจ.
// ์นด์ดํ
๊ฐ์ฐ์ ์ฌ๊ธฐ์ ํด์ผ,
// ๋งจ์ฒ์ ๋จ๊ณ์ ์ฌ๊ท ๋จ๊ณ ํจ์์์ ์งํ์ด ๊ฐ๋ฅํจ.
--cnt;
v[i][j] = 0;
}
}
}
}
int main()
{
// 1๋จ๊ณ
//๋ฒฝ์ ๋จผ์ ์ธ์.
// ๊ทธ๋ฌ๋ค๊ฐ ์นด์ดํ
์ด 3์ด๋๋ฉด ๋ฐ๋ก
// 2๋จ๊ณ
// dfs๋ก ๋ฐ์ด๋ฌ์ค๋ฅผ ํ์ฐ์ํด
// ํ์ฐํ๋ค๊ฐ ๋ง์ง๋ง์ ๋์ฐฉํ๋ค๊ฑฐ๋,
// ๋ฒฝ์ ๋ง์ฃผํ์ ๋๋ ์ข
๋ฃ
// 3๋จ๊ณ
//๋ฒฝ์ ์ธ์ธ๋ 2์ฐจ ํฌ๋ฌธ์ผ๋ก ๋๋ฆฌ๋ฉด์ , ์นด์ดํ
๊ฐ์
// ๋ค์ ์ธ๋ฑ์ค๋ฅผ ์งํํ๊ณ ,
// ์นด์ดํ
3์ผ๋ ๋ค์ ๋ฐ์ด๋ฌ์ค ํ์ฐ
int n, m;
cin >> n >> m;
vector<vector<int>>v(n, vector<int>(m, 0));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> v[i][j];
}
}
// ๋ฒฝ์ ์ค์นํ์
MakeWall(v);
// ๋ฐ์ด๋ฌ์ค๋ฅผ ํ์ฐํ์.
cout << answer;
}