# 본인 풀이
#include<bits/stdc++.h>
using namespace std;
int n, ret;
int a[100][100];
int visited[100][100];
int dx[4] = {0, 1, 0, -1};
int dy[4] = {-1, 0, 1, 0};
// 비의 양이 늘어날수록 잠기는 영역은 많아진다.
// 잠기는 영역 양상에 따라 안전한 영역(연결된 컴포넌트)의 수는 많아질 수도, 적어질 수도 있다.
// 높이를 매번 1~100까지 늘려가야하나? - 시도해보기.
void dfs(int y, int x, int rain){
visited[y][x] = 1;
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){
continue;
}
// 방문하지 않은 곳이면서 수압보다 높은 위치의 타일
if(a[ny][nx] > rain && visited[ny][nx] == 0){
dfs(ny, nx, rain);
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
cin >> a[i][j];
}
}
int max_value = 0;
for (int k = 0; k < 100; k++){
ret = 0;
memset(visited, 0, sizeof(visited));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (visited[i][j] || a[i][j] <= k)
{
continue;
}
dfs(i, j, k);
ret++;
}
}
max_value = max(ret, max_value);
}
cout << max_value << "\n";
return 0;
}
정답
- DFS로 풀이했음
- 안전영역은 비에 잠긴 영역의 양상에 따라 매번 달라지기 때문에 강수량이 1~100까지로 조건에 있으므로 모든 강수량을 순회하며 DFS visited를 체크하였음
# 모범답안
memset과 fill 차이 외에는 거의 비슷해서 생략