본문 바로가기
BaekJoon/C++

2468 : 안전 영역 (C++)

by GrayChoi 2021. 2. 4.
반응형

 

2468번: 안전 영역

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는

www.acmicpc.net


장마철에 물에 잠기지 않는 안전한 영역의 최대 개수를 출력한다.

비의 양이 정수만큼 내리는게 아니므로 아무 지역도 물에 잠기지 않을 수 있다.

값을 다 받으면서 제일 높은 위치 값을 확인 한 후

제일 높은 위치의 값 만큼만 확인해 보면된다.

각각 높이별로 DFS를 실행하여 안전한 영역의 수의 최대 개수를 비교하면서 구한 후

출력하면 끝.

오늘 문제 많이풀었다.

#include<iostream>

using namespace std;

#define MAX 100

int map[MAX][MAX];
bool visit[MAX][MAX];

int N;
int max_value = 0;
int max_height = 0;

int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};

void dfs(int x, int y) {
    visit[x][y] = true;

    for(int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if(nx >= 0 && nx < N && ny >= 0 && ny < N) {
            if(visit[nx][ny] == false) {
                dfs(nx, ny);
            }
        }
    }
}

int main() {
    cin >> N;

    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++) {
            cin >> map[i][j];
            max_height = max_height < map[i][j] ? map[i][j] : max_height;
        }
    }

    for(int i = 1; i <= max_height; i++) {
        fill(visit[0], visit[N], false);

        for(int j = 0; j < N; j++) {
            for(int k = 0; k < N; k++) {
                if(map[j][k] <= i) {
                    visit[j][k] = true;
                }
            }
        }

        int cnt = 0;

        for(int j = 0; j < N; j++) {
            for(int k = 0; k < N; k++) {
                if(visit[j][k] == false) {
                    dfs(j, k);
                    cnt++;
                }
            }
        }
        max_value = max_value < cnt ? cnt : max_value;

    }

    if(max_value == 0) {
        max_value = 1;
    }

    cout << max_value << endl;

    return 0;
}

 

반응형

'BaekJoon > C++' 카테고리의 다른 글

2583 : 영역 구하기 (C++)  (0) 2021.02.05
1946 : 신입 사원 (C++)  (0) 2021.02.05
7576 : 토마토 (C++)  (0) 2021.02.04
4963 : 섬의 개수 (C++)  (0) 2021.02.04
1012 : 유기농 배추 (C++)  (0) 2021.02.04

댓글