문제

문제 링크

문제 접근

  • 이 문제는 bfs를 이용하면 손쉽게 풀 수 있는 문제이다.
  • 수심의 높이를 계속 높여가면서 그룹의 개수가 몇개인지를 찾아주며 가장 그룹개수가 큰 경우를 찾으면 된다.

코드

#include <cstdio>
#include <queue>
#include <vector>
#define pii pair<int, int>

using namespace std;

int n, arr[101][101], sinked[101][101], visited[101][101], MAX;
int d[4][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };

int main(){
    scanf("%d", &n);
    for(int i = 1; i < n + 1; i++){
        for(int j = 1; j < n + 1; j++)scanf("%d", &arr[i][j]);
    }
    for(int k = 1; k < 101; k++){
        for(int i = 1; i < n + 1; i++){
            for(int j = 1; j < n + 1; j++){
                visited[i][j] = 0;
                if(arr[i][j] < k)sinked[i][j] = 0;
                else sinked[i][j] = 1;
            }
        }
        int cnt = 0;
        for(int i = 1; i < n + 1; i++){
            for(int j = 1; j < n + 1; j++){
                if(sinked[i][j] && !visited[i][j]){
                    queue<pii> q;
                    q.push(pii(i,j));
                    visited[i][j] = 1;
                    while(!q.empty()){
                        int fx = q.front().first, fy = q.front().second; q.pop();
                        for(int i = 0; i < 4; i++){
                            int nx = fx + d[i][0], ny = fy + d[i][1];
                            if(!sinked[nx][ny] || visited[nx][ny]) continue;
                            visited[nx][ny] = 1;
                            q.push(pii(nx, ny));
                        }
                    }
                    cnt++;
                }
            }
        }
        if(cnt > MAX)MAX = cnt;
    }
    printf("%d", MAX);
}

느낀점

  • bfs만 잘 이용할 수 있다면 간단히 풀어낼 수 있는 문제이다!