πŸ’»

[λ°±μ€€] DFS와 BFS - 2468. μ•ˆμ „μ˜μ—­(DFS 풀이 + BFS 풀이) λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/λ¬Έμ œν’€μ΄ Baekjoon

[λ°±μ€€] DFS와 BFS - 2468. μ•ˆμ „μ˜μ—­(DFS 풀이 + BFS 풀이)

λ˜νš¨λ‹ˆ 2020. 2. 26. 13:38

문제

μž¬λ‚œλ°©μž¬μ²­μ—μ„œλŠ” λ§Žμ€ λΉ„κ°€ λ‚΄λ¦¬λŠ” μž₯λ§ˆμ² μ— λŒ€λΉ„ν•΄μ„œ λ‹€μŒκ³Ό 같은 일을 κ³„νšν•˜κ³  μžˆλ‹€. λ¨Όμ € μ–΄λ–€ μ§€μ—­μ˜ 높이 정보λ₯Ό νŒŒμ•…ν•œλ‹€. κ·Έ λ‹€μŒμ— κ·Έ 지역에 λ§Žμ€ λΉ„κ°€ 내렸을 λ•Œ 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ΄ μ΅œλŒ€λ‘œ λͺ‡ κ°œκ°€ λ§Œλ“€μ–΄ μ§€λŠ” 지λ₯Ό μ‘°μ‚¬ν•˜λ €κ³  ν•œλ‹€. μ΄λ•Œ, 문제λ₯Ό κ°„λ‹¨ν•˜κ²Œ ν•˜κΈ° μœ„ν•˜μ—¬, μž₯λ§ˆμ² μ— λ‚΄λ¦¬λŠ” λΉ„μ˜ 양에 따라 μΌμ •ν•œ 높이 μ΄ν•˜μ˜ λͺ¨λ“  지점은 물에 μž κΈ΄λ‹€κ³  κ°€μ •ν•œλ‹€.

μ–΄λ–€ μ§€μ—­μ˜ 높이 μ •λ³΄λŠ” ν–‰κ³Ό μ—΄μ˜ 크기가 각각 N인 2차원 λ°°μ—΄ ν˜•νƒœλ‘œ 주어지며 λ°°μ—΄μ˜ 각 μ›μ†ŒλŠ” ν•΄λ‹Ή μ§€μ μ˜ 높이λ₯Ό ν‘œμ‹œν•˜λŠ” μžμ—°μˆ˜μ΄λ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒμ€ N=5인 μ§€μ—­μ˜ 높이 정보이닀.

이제 μœ„μ™€ 같은 지역에 λ§Žμ€ λΉ„κ°€ λ‚΄λ €μ„œ 높이가 4 μ΄ν•˜μΈ λͺ¨λ“  지점이 물에 μž κ²Όλ‹€κ³  ν•˜μž. 이 κ²½μš°μ— 물에 μž κΈ°λŠ” 지점을 νšŒμƒ‰μœΌλ‘œ ν‘œμ‹œν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ΄λΌ 함은 물에 μž κΈ°μ§€ μ•ŠλŠ” 지점듀이 μœ„, μ•„λž˜, 였λ₯Έμͺ½ ν˜Ήμ€ μ™Όμͺ½μœΌλ‘œ 인접해 있으며 κ·Έ 크기가 μ΅œλŒ€μΈ μ˜μ—­μ„ λ§ν•œλ‹€. μœ„μ˜ κ²½μš°μ—μ„œ 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ€ 5κ°œκ°€ λœλ‹€(κΌ­μ§“μ μœΌλ‘œλ§Œ λΆ™μ–΄ μžˆλŠ” 두 지점은 μΈμ ‘ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μ·¨κΈ‰ν•œλ‹€). 

λ˜ν•œ μœ„μ™€ 같은 μ§€μ—­μ—μ„œ 높이가 6μ΄ν•˜μΈ 지점을 λͺ¨λ‘ 잠기게 λ§Œλ“œλŠ” λ§Žμ€ λΉ„κ°€ 내리면 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ€ μ•„λž˜ κ·Έλ¦Όμ—μ„œμ™€ 같이 λ„€ κ°œκ°€ 됨을 확인할 수 μžˆλ‹€. 

이와 같이 μž₯λ§ˆμ² μ— λ‚΄λ¦¬λŠ” λΉ„μ˜ 양에 λ”°λΌμ„œ 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ˜ κ°œμˆ˜λŠ” λ‹€λ₯΄κ²Œ λœλ‹€. μœ„μ˜ μ˜ˆμ™€ 같은 μ§€μ—­μ—μ„œ λ‚΄λ¦¬λŠ” λΉ„μ˜ 양에 λ”°λ₯Έ λͺ¨λ“  경우λ₯Ό λ‹€ 쑰사해 보면 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ˜ 개수 μ€‘μ—μ„œ μ΅œλŒ€μΈ κ²½μš°λŠ” 5μž„μ„ μ•Œ 수 μžˆλ‹€. 

μ–΄λ–€ μ§€μ—­μ˜ 높이 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, μž₯λ§ˆμ² μ— 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ˜ μ΅œλŒ€ 개수λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 

 

 

μž…λ ₯

첫째 μ€„μ—λŠ” μ–΄λ–€ 지역을 λ‚˜νƒ€λ‚΄λŠ” 2차원 λ°°μ—΄μ˜ ν–‰κ³Ό μ—΄μ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 수 N이 μž…λ ₯λœλ‹€. N은 2 이상 100 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€. λ‘˜μ§Έ 쀄뢀터 N개의 각 μ€„μ—λŠ” 2차원 λ°°μ—΄μ˜ 첫 번째 ν–‰λΆ€ν„° N번째 ν–‰κΉŒμ§€ μˆœμ„œλŒ€λ‘œ ν•œ ν–‰μ”© 높이 정보가 μž…λ ₯λœλ‹€. 각 μ€„μ—λŠ” 각 ν–‰μ˜ 첫 번째 μ—΄λΆ€ν„° N번째 μ—΄κΉŒμ§€ N개의 높이 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μžμ—°μˆ˜κ°€ 빈 칸을 사이에 두고 μž…λ ₯λœλ‹€. λ†’μ΄λŠ” 1이상 100 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€.

 

좜λ ₯

첫째 쀄에 μž₯λ§ˆμ² μ— 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ˜ μ΅œλŒ€ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯1

5
6 8 2 6 2
3 2 3 4 6
6 7 3 3 2
7 2 5 3 6
8 9 5 2 7

 

예제 좜λ ₯1

5

 

λ…ΈνŠΈ

아무 지역도 물에 μž κΈ°μ§€ μ•Šμ„ 수 μžˆλ‹€. 

 

생각

 

 

μž‘μ„±ν•œ μ½”λ“œ

#include <iostream>
#include <algorithm>
#define MAX 100

using namespace std;

int n,result;
int map[MAX][MAX] = {0, };a
bool visited[MAX][MAX];
// 상,ν•˜,쒌,우
int dx[] = { -1, 1, 0, 0 };
int dy[] = { 0, 0, -1, 1 };
 
void dfs(int x, int y, int height) {
    visited[x][y] = true;
 
    for (int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        
        if (nx < 0 || ny < 0 || nx >= n || ny >= n){ //λ°°μ—΄ 인덱슀 μ•ˆ λ„˜κ²Œλ”
            continue;
        }
        if (map[nx][ny] > height && !visited[nx][ny]){
            dfs(nx, ny, height);
        }
    }
}

int main(int argc, const char * argv[]) {
    // insert code here...
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin >> n;
    
    int maxDepth = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> map[i][j];
            maxDepth = max(maxDepth, map[i][j]);
        }
    }
    
    for (int height = 0; height <= maxDepth; height++) {
        int safeNum = 0;
        memset(visited, 0, sizeof(visited));
        
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (map[i][j] > height && !visited[i][j]) {
                    dfs(i, j, height);
                    safeNum++;
                }
            }
        }
        result = max(result, safeNum);
    }
    cout << result << endl;

    return 0;
}

 

 

+ BFS풀이 μΆ”κ°€

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#define MAX 100

using namespace std;

int n,result;
int map[MAX][MAX];
bool visited[MAX][MAX];
// 상,ν•˜,쒌,우
int dx[] = { -1, 1, 0, 0 };
int dy[] = { 0, 0, -1, 1 };
 
void BFS(int a, int b, int h)
{
    queue<pair<int, int>> q;
    q.push(make_pair(a, b));
    visited[a][b] = true;
    while (!q.empty())
    {
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
 
        for (int i = 0; i < 4; i++){
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx >= 0 && ny >= 0 && nx < n && ny < n){
                if (visited[nx][ny] == false && map[nx][ny] > h){
                    visited[nx][ny] = true;
                    q.push(make_pair(nx, ny));
                }
            }
        }
    }
}

int main(int argc, const char * argv[]) {
    // insert code here...
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin >> n;
    
    int maxDepth = 0;
    
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> map[i][j];
            maxDepth = max(maxDepth, map[i][j]);
        }
    }
    
    for (int height = 0; height <= maxDepth; height++) {
        int safeNum = 0;
        memset(visited, 0, sizeof(visited));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (map[i][j] > height && !visited[i][j]) {
                    safeNum++;
                    BFS(i,j,height);
                }
            }
        }
        result = max(result, safeNum);
    }
    cout << result << endl;

    return 0;
}

λ°˜μ‘ν˜•
Comments