www.acmicpc.net/problem/2468

 

2468번: 안전 영역

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

www.acmicpc.net


  • 비의 높이가 얼마냐에 따라서 영역들이 다르게 된다.
  • 가능한 비의 높이는 0 ~ 최대 100 까지 이기 때문에, 각 높이별로 DFS 를 한번씩 돌려서 영역의 값들을 비교해나간다.

#include <iostream>
#include <vector>

using namespace std;

int n, temp, maxi, answer;
int map[100][100];
bool tmap[100][100];
int dir[4] = {-1, 1, 0, 0};

void dfs(int r, int c)
{
    if(0 <= r && r < n && 0 <= c && c < n)      // 인덱스 검사
    {
        if(tmap[r][c])                          // 이어지는 영역이라면
        {
            tmap[r][c] = false;                 // 방문처리
            for(int i = 0 ; i < 4 ; i++)        // 4방향으로 이어지는게 더 있는지 확인
            {
                dfs(r + dir[i], c + dir[3-i]);
            }
        }
    }
}

int main(void)
{
    cin >> n;
    for(int r = 0 ; r < n ; r++)
        for(int c = 0 ; c < n ; c++)
        {
            cin >> temp;
            map[r][c] = temp;
            if(temp > maxi) maxi = temp;
        }

    for(int height = 2 ; height < maxi ; height++)              // 가능한 장마의 높이를 전부 탐색
    {
        for(int r = 0 ; r < n ; r++)
            for(int c = 0 ; c < n ; c++)
            {
                if(map[r][c] <= height) tmap[r][c] = false;     // dfs 에 사용할 tmap 을 매번 적절하게 초기화
                else tmap[r][c] = true;
            }
        
        temp = 0;
        for(int r = 0 ; r < n ; r++)                            // dfs
            for(int c = 0 ; c < n ; c++)
            {
                if(tmap[r][c])
                {
                    dfs(r, c);
                    temp++;
                }
            }

        if(temp > answer) answer = temp;                        // 안전 영역 갯수 최댓값 갱신
    }

    cout << answer << endl;
}

'PS > BOJ' 카테고리의 다른 글

[백준] 1946 : 신입 사원  (0) 2020.09.17
[백준] 9934 : 완전 이진 트리  (0) 2020.09.16
[백준] 4963 : 섬의 개수  (0) 2020.09.14
[백준] 19844 : 단어 개수 세기  (0) 2020.09.13
[백준] 2156.cpp : 포도주 시식  (0) 2020.09.11

+ Recent posts