17142. ์ฐ๊ตฌ์ 3
by rlaehddnd0422https://www.acmicpc.net/problem/17142
Point
1. ์ฐ๊ตฌ์ 2์ ๋ฌ๋ฆฌ ๋นํ์ฑํ ๋ฐ์ด๋ฌ์ค๊ฐ ์กด์ฌ.
2. ํ์ฑํ ๋ฐ์ด๋ฌ์ค๊ฐ ๋นํ์ฑํ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์นธ์ผ๋ก ๊ฐ๋ฉด ๋นํ์ฑํ ๋ฐ์ด๋ฌ์ค๊ฐ ํ์ฑํ ๋ฐ์ด๋ฌ์ค๋ก ๋ฐ๋๋ค.
3. ํ์ฑํ ๋ฐ์ด๋ฌ์ค๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ์ ์๋ ์ต๋ 10๊ฐ์ค์์ 5๊ฐ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ๋ก 10C5 = 252๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค.
4. ์ต๋ 10C5์ ๋ํด BFS๋ฅผ ์คํํ๋ฉด O(252*50*50)=630,000 ์ผ๋ก ์๊ฐ ์์ ํต๊ณผ ๊ฐ๋ฅ.
์ด ํ ์คํธ์ผ์ด์ค์ ๊ฒฝ์ฐ ์ ํํ ์ ์๋ 2์ ๊ฒฝ์ฐ์ ์๋ ์ด 4๊ฐ์ค์ 2๊ฐ์ด๋ค. ๋ฐ๋ผ์ ์ด 4C2 = 6๊ฐ์ง ๊ฒฝ์ฐ์ ์๊ฐ ์กด์ฌํ๋ค.
์ ์ผ์ด์ค์ ๊ฒฝ์ฐ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋๋ฐ ๋ ๋ฒ์งธ ๊ฒฝ์ฐ๋ฅผ ๋ณด๋ฉด ๋ต์ด 3์ด๋ผ๊ณ ๊ธฐ๋ํ ์ ์๋๋ฐ, ๋ต์ 2์ด๋ค.
3์ด ๋ค์ด๊ฐ ์นธ์ ๋นํ์ฑํ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์นธ์ผ๋ก ์ต๋ ์๊ฐ์ ๊ณ์ฐํ ๋์๋ ๋นํ์ฑํ ๋ฐ์ด๋ฌ์ค์นธ์ ์ดํด๋ณด์ง ์์๋ ๋๋ค.
Why ? ๋ฌธ์ ์์ ๋ชจ๋ ๋น ์นธ์ ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆฌ๋ ์ต์ ์๊ฐ์ ๊ตฌํ๋ผ๊ณ ํ๊ธฐ ๋๋ฌธ์ ๋นํ์ฑํ ๋ฐ์ด๋ฌ์ค ์นธ์ ์ดํด๋ณด์ง ์์๋ ๋๋ค.
ํ ๊ฐ์ง ์ผ์ด์ค๋ฅผ ๋ ์ดํด๋ณด์.
์ด ์ผ์ด์ค์ ๊ฒฝ์ฐ๋ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค
๋นํ์ฑํ ๋ฐ์ด๋ฌ์ค์ ํ์ฑํ ๋ฐ์ด๋ฌ์ค๊ฐ ๋ฟ๊ณ ๋ ๋ค์๋ ์ด๋ป๊ฒ ์งํ์ ํด์ฃผ์ด์ผ ํ ๊น?
์ฐ๊ตฌ์ 2 ๋ฌธ์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก BFS๋ฅผ ์งํํ ๋์๋ ๋นํ์ฑํ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์นธ์ ๋น ์นธ์ผ๋ก ์ทจ๊ธํด์ฃผ๊ณ ,
์ต์ ์๊ฐ์ ๊ณ์ฐํ ๋์๋ ๋นํ์ฑํ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์นธ์ ์ดํด๋ณด์ง ์์ผ๋ฉด ๋๋ค.
์ฐ๊ตฌ์ 2 ๋ฌธ์ ์์ ์ฐจ์ด์ ์ ๋จ์ง ๋นํ์ฑํ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์นธ์ ์ดํด๋ณด๋์ง์ ๋ํ ์ฌ๋ถ.
์์ค ์ฝ๋๋ฅผ ์ดํด๋ณด์.
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <utility>
#define FASTio ios_base :: sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
#define endl '\n'
using namespace std;
vector<vector<int>> area(51,vector<int>(51));
vector<pair<int,int>> virus;
int n, m;
int ans=-1;
int dy[]={-1,1,0,0};
int dx[]={0,0,1,-1};
int blank;
int bfs(queue<pair<int,int>> &q,vector<vector<bool>> check, vector<vector<int>> visited, vector<vector<bool>> &awake,int ans)
{
int result=-1;
int cnt = 0;
while(!q.empty())
{
if(blank==cnt)
{
break;
}
for(int i=0;i<q.size();i++)
{
int y = q.front().first;
int x = q.front().second;
for(int i=0;i<4;i++)
{
int ny = y+dy[i];
int nx = x+dx[i];
if(ny>=0 && nx>=0 && ny<n && nx<n)
{
if(check[ny][nx]==false && area[ny][nx]!=1)
{
if(area[ny][nx]==2 && awake[ny][nx]==false)
{
awake[ny][nx]=true;
}
if(area[ny][nx]==0) cnt++;
visited[ny][nx] = visited[y][x]+1;
check[ny][nx]=true;
q.push({ny,nx});
}
}
}
q.pop();
}
}
if(blank==cnt)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(awake[i][j]==false)
result = max(result,visited[i][j]);
if(area[i][j]==0 && check[i][j]==false)
return -1;
}
}
}
return result;
}
int main()
{
FASTio;
cin >> n >> m;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin >> area[i][j];
if(area[i][j]==2)
{
virus.push_back({i,j});
}
else if(area[i][j]==0)
{
blank++;
}
}
}
// ์กฐํฉ ์ด๊ธฐ ์์
vector<int> k(virus.size());
for(int i=0;i<m;i++)
{
k[i] = 1;
}
for(int i=m;i<virus.size();i++)
{
k[i] = 0;
}
sort(k.begin(),k.end());
// ์กฐํฉ
do
{
queue<pair<int,int>> q;
vector<vector<int>> visited(51,vector<int>(51,0));
vector<vector<bool>> check(51,vector<bool>(51,false));
vector<vector<bool>> awake(51,vector<bool>(51,false));
for(int i=0;i<virus.size();i++)
{
if(k[i]==1)
{
int y,x;
tie(y,x) = virus[i];
q.push(make_pair(y,x));
check[y][x]=true;
awake[y][x]=true;
}
}
int a = bfs(q,check,visited,awake,ans);
if(a==-1) continue;
else
{
if(ans==-1 || ans>a)
{
ans = a;
}
}
} while (next_permutation(k.begin(),k.end()));
cout << ans;
return 0;
}
Main
1. ๋ฐฐ์ด ์ ๋ ฅ -> 2์ผ ๊ฒฝ์ฐ ์กฐํฉ ์ ํ์ง์ ํฌํจ์ํค๊ธฐ ์ํด ๋ฒกํฐ ํธ์ฌ, 0์ผ ๊ฒฝ์ฐ ๋น์นธ์ ๊ฐ์++
2. next_permutation์ ์ด์ฉํ ์กฐํฉ์ ์ด์ฉํ๊ธฐ ์ํ ์ด๊ธฐ์์
3. 2์ ์ด ๊ฐ์ ์ค์ m๊ฐ ์ ํํ๋ ๊ฐ ๊ฒฝ์ฐ์ ๋ํ BFS
BFS
1. ํ์ฌ ํ์๋ ํ์ฑํ ๋ ๋ฐ์ด๋ฌ์ค m๊ฐ๊ฐ ๋ค์ด์๋ ์ํฉ
2. ์ฐ๊ตฌ์ 2์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ฅผ ํ๋ฒ ๋๋ฉด์ BFS๋ฅผ ์งํํ๋ค.
3. BFS๋ฅผ ์งํํ๋ ๋์ค mainํจ์์์ ๋น์นธ์ ๊ฐ์๋งํผ ๋ค ์ฑ์ด ๊ฒฝ์ฐ ๋ ์ดํด๋ณผ ํ์๊ฐ ์์ผ๋ฏ๋ก BFS๋ฅผ ์ข ๋ฃํ๋ค.
4. BFS๋ฅผ ์งํํ๋ ๋์ค ๋นํ์ฑํ ๋ฐ์ด๋ฌ์ค๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ ํ์ฑํ ์์ผ์ค๋ค.
5. ๊ทธ ์ธ๋ ์ฐ๊ตฌ์ 2์ ๋์ผํ๋ฐ BFS๊ฐ ์ข ๋ฃ๋๊ณ ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๋๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ์ ์ดํด๋ณผ ๋์ ๋นํ์ฑํ ๋ฐ์ด๋ฌ์ค ์นธ์ ์ดํด๋ณด์ง ์๋๋ค.
๋ถ๋ช ์๊ฐ๋ณต์ก๋๋ฅผ ๊ณ์ฐํ์ ๋ ํต๊ณผ๋ ๊ฒ์ด๋ผ ์๊ฐํ๋๋ฐ ์๊ณ ๋ณด๋ ๋ด๋ถ์ ๋ก์ง์ ๋ฌธ์ ๊ฐ ์์๋ค.
AC ์ฝ๋ (BFS)
while(!q.empty())
{
if(blank==cnt)
{
break;
}
for(int i=0;i<q.size();i++)
{
int y = q.front().first;
int x = q.front().second;
for(int i=0;i<4;i++)
{
int ny = y+dy[i];
int nx = x+dx[i];
if(ny>=0 && nx>=0 && ny<n && nx<n)
{
if(check[ny][nx]==false && area[ny][nx]!=1)
{
if(area[ny][nx]==2 && awake[ny][nx]==false)
{
awake[ny][nx]=true;
}
if(area[ny][nx]==0) cnt++;
visited[ny][nx] = visited[y][x]+1;
check[ny][nx]=true;
q.push({ny,nx});
}
}
}
q.pop();
}
}
์๊ฐ์ด๊ณผ ์ฝ๋ (BFS)
while(!q.empty())
{
if(blank==cnt)
{
break;
}
for(int i=0;i<q.size();i++)
{
int y = q.front().first;
int x = q.front().second;
for(int i=0;i<4;i++)
{
int ny = y+dy[i];
int nx = x+dx[i];
if(ny>=0 && nx>=0 && ny<n && nx<n)
{
if(check[ny][nx]==false && area[ny][nx]!=1)
{
if(area[ny][nx]==2 && awake[ny][nx]==false)
{
awake[ny][nx]=true;
}
if(area[ny][nx]==0) cnt++;
visited[ny][nx] = visited[y][x]+1;
check[ny][nx]=true;
q.push({ny,nx});
}
}
}
}
q.pop();
}
q๋ฅผ popํ๋ ์์ ์ด ์ํ์ข์ฐ๋ฅผ ์ดํผ๊ณ ํธ์ฌ๋ฅผ ํ ์งํ ๋ฐ๋ก ํ์ ํด์ฃผ์ด์ผ ํ๋๋ฐ q size๋งํผ for๋ฌธ์ ๋๋ฆฐ๋ค์ ๋ค๋ฆ๊ฒ ํ์ ํด์ฃผ์ด์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ ๊ฒ ์ฌ์ํด๋ณด์ด์ง๋ง ์ค์ํ ๋ก์ง์ ๋๋ฒ๊น ํ๊ธฐ ์ด๋ ค์ฐ๋ ๊ตฌํํ ๋์ ๋์ฑ ์ ๊ฒฝ์จ์ผ๊ฒ ๋ค.
'๐ CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++] cin.ignore()์ผ๋ก ๋ฒํผ ๋น์ฐ๊ธฐ (0) | 2023.09.04 |
---|---|
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ(Greedy Algorithm) (0) | 2023.02.13 |
4991. ๋ก๋ด์ฒญ์๊ธฐ (0) | 2023.02.07 |
2151. ๊ฑฐ์ธ์ค์น (0) | 2023.02.03 |
14442. ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ 2 (0) | 2023.02.01 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422