수학과의 좌충우돌 프로그래밍

[C++] BAEKJOON 2468 안전 영역 본문

알고리즘/C++

[C++] BAEKJOON 2468 안전 영역

ssung.k 2019. 10. 31. 15:02

https://www.acmicpc.net/problem/2468

 

2468번: 안전 영역

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는 안전한 영역이 최대로 몇 개가 만들어 지는 지를 조사하려고 한다. 이때, 문제를 간단하게 하기 위하여, 장마철에 내리는 비의 양에 따라 일정한 높이 이하의 모든 지점은 물에 잠긴다고 가정한다. 어떤 지역의 높이 정보는 행과 열의 크기가 각각 N인 2차원 배열 형태로 주어

www.acmicpc.net

dfs 를 사용하여 문제를 해결하였습니다.

  • 최대 높이 maxH 측정
  • 높이 0 부터 maxH 까지 각 경우를 고려
  • visited 배열을 만들어서 물에 잠기는 지역과 잠기지 않은 지역을 표시
  • dfs 를 이용하여 안전영역의 개수 계산
  • 매 높이 마다 안전영역의 개수를 계산하여 최대값 출력
#include <iostream>

using namespace std;

int board[101][101];
int visited[101][101];

int dr[] = {0,0,1,-1};
int dc[] = {1,-1,0,0};

void dfs(int r, int c, int n){
    
    visited[r][c] = -1;
    
    for (int i=0;i<4;i++){
        int nr = r + dr[i];
        int nc = c + dc[i];
        if (0<=nr && nr<n && 0<=nc && nc<n){
            if (visited[nr][nc] == 0)
                dfs(nr,nc,n);
        }
    }
}

int main(int argc, const char * argv[]) {
    
    int n;
    cin >> n;
    
    int maxH = 0;
    
    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++){
            cin >> board[i][j];
            if (board[i][j] > maxH)
                maxH = board[i][j];
        }
    }

    
    int safeNumMax = 0;
    
    for (int h=0;h<=maxH;h++){
        // visited 초기화
        for (int i=0;i<n;i++){
            for (int j=0;j<n;j++){
                // 물에 잠기면 -1 아니면 0
                if (board[i][j] <= h)
                    visited[i][j] = -1;
                else
                    visited[i][j] = 0;
            }
        }
        
        int safeNum = 0;
        
        for (int i=0;i<n;i++){
            for (int j=0;j<n;j++){
                if (visited[i][j] == 0){
                    
                    safeNum++;
                    dfs(i,j,n);
                }
            }
        }
        
        safeNumMax = max(safeNumMax, safeNum);
    }
    
    cout << safeNumMax << "\n";
  
    return 0;
}

 

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

[C++] BAEKJOON 6593 상범 빌딩  (0) 2019.11.01
[C++] BAEKJOON 2146 다리 만들기  (0) 2019.10.31
[C++] BAEKJOON 5212 지구 온난화  (0) 2019.10.29
[C++] BAEKJOON 2246 콘도 선정  (0) 2019.10.29
[C++] BAEKJOON 4949 균형잡힌 세상  (0) 2019.10.05
Comments