# 본인 풀이

#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;
}

정답

  1. DFS로 풀이했음
  2. 안전영역은 비에 잠긴 영역의 양상에 따라 매번 달라지기 때문에 강수량이 1~100까지로 조건에 있으므로 모든 강수량을 순회하며 DFS visited를 체크하였음

# 모범답안

memset과 fill 차이 외에는 거의 비슷해서 생략