알고리즘/BOJ
[c/c++] 백준/BOJ 2468번 문제 - 안전 영역
wonjun.Aden
2022. 3. 29. 15:58
https://www.acmicpc.net/problem/2468
2468번: 안전 영역
재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는
www.acmicpc.net
문제


문제풀이
#include <bits/stdc++.h>
using namespace std;
int board[103][103];
int vis[103][103];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
//안전영역
//많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획중
//어떤 지역의 높이 정보를 파악
//
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n;
int maxNum =0;
cin >> n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin >> board[i][j];
maxNum = max(maxNum,board[i][j]);
}
}
/* cout << minNum << ' ' << maxNum << '\n';
cout << "========================\n";
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout << board[i][j] << ' ';
}
cout << '\n';
} */
int maxCount=0;
for(int height=0; height <= maxNum;height++){
//vis 초기화 필수
for(int i=0;i<n;i++){
fill(vis[i],vis[i]+n,0);
}
//영역 카운트
int ans =0;
for(int i=0;i<n; i++){
for(int j=0;j<n;j++){
if(board[i][j] > height && vis[i][j] == 0){
queue<pair<int,int>> Q;
Q.push({i,j});
vis[i][j] = 1;
while (!Q.empty())
{
auto cur = Q.front();Q.pop();
for(int dir =0;dir <4;dir++){
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
//4방향을 돌아야 하는데 height보다 커야함
if(nx < 0 || nx >=n || ny < 0 || ny >= n) continue;
if(vis[nx][ny]!=0 || board[nx][ny] <= height) continue;
Q.push({nx,ny});
vis[nx][ny] = 1;
}
}
ans++;
}
}
}
maxCount = max(maxCount,ans);
}
cout << maxCount;
return 0;
}
문제의 포인트
- 지역의 최대 높이만큼 반복해서 영역의 개수가 가장 많이 나올때를 출력
반응형