๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ

[C++/BOJ] 2468 : ์•ˆ์ „ ์˜์—ญ (bfs/dfs)

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

 

๋ฌธ์ œ

์žฌ๋‚œ๋ฐฉ์žฌ์ฒญ์—์„œ๋Š” ๋งŽ์€ ๋น„๊ฐ€ ๋‚ด๋ฆฌ๋Š” ์žฅ๋งˆ์ฒ ์— ๋Œ€๋น„ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ๊ณ„ํšํ•˜๊ณ  ์žˆ๋‹ค. ๋จผ์ € ์–ด๋–ค ์ง€์—ญ์˜ ๋†’์ด ์ •๋ณด๋ฅผ ํŒŒ์•…ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ์— ๊ทธ ์ง€์—ญ์— ๋งŽ์€ ๋น„๊ฐ€ ๋‚ด๋ ธ์„ ๋•Œ ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š๋Š” ์•ˆ์ „ํ•œ ์˜์—ญ์ด ์ตœ๋Œ€๋กœ ๋ช‡ ๊ฐœ๊ฐ€ ๋งŒ๋“ค์–ด ์ง€๋Š” ์ง€๋ฅผ ์กฐ์‚ฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋•Œ, ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ, ์žฅ๋งˆ์ฒ ์— ๋‚ด๋ฆฌ๋Š” ๋น„์˜ ์–‘์— ๋”ฐ๋ผ ์ผ์ •ํ•œ ๋†’์ด ์ดํ•˜์˜ ๋ชจ๋“  ์ง€์ ์€ ๋ฌผ์— ์ž ๊ธด๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

์–ด๋–ค ์ง€์—ญ์˜ ๋†’์ด ์ •๋ณด๋Š” ํ–‰๊ณผ ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ๊ฐ N์ธ 2์ฐจ์› ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ฃผ์–ด์ง€๋ฉฐ ๋ฐฐ์—ด์˜ ๊ฐ ์›์†Œ๋Š” ํ•ด๋‹น ์ง€์ ์˜ ๋†’์ด๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ž์—ฐ์ˆ˜์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์€ N=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

์ด์ œ ์œ„์™€ ๊ฐ™์€ ์ง€์—ญ์— ๋งŽ์€ ๋น„๊ฐ€ ๋‚ด๋ ค์„œ ๋†’์ด๊ฐ€ 4 ์ดํ•˜์ธ ๋ชจ๋“  ์ง€์ ์ด ๋ฌผ์— ์ž ๊ฒผ๋‹ค๊ณ  ํ•˜์ž. ์ด ๊ฒฝ์šฐ์— ๋ฌผ์— ์ž ๊ธฐ๋Š” ์ง€์ ์„ ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

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

๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š๋Š” ์•ˆ์ „ํ•œ ์˜์—ญ์ด๋ผ ํ•จ์€ ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š๋Š” ์ง€์ ๋“ค์ด ์œ„, ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ ํ˜น์€ ์™ผ์ชฝ์œผ๋กœ ์ธ์ ‘ํ•ด ์žˆ์œผ๋ฉฐ ๊ทธ ํฌ๊ธฐ๊ฐ€ ์ตœ๋Œ€์ธ ์˜์—ญ์„ ๋งํ•œ๋‹ค. ์œ„์˜ ๊ฒฝ์šฐ์—์„œ ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š๋Š” ์•ˆ์ „ํ•œ ์˜์—ญ์€ 5๊ฐœ๊ฐ€ ๋œ๋‹ค(๊ผญ์ง“์ ์œผ๋กœ๋งŒ ๋ถ™์–ด ์žˆ๋Š” ๋‘ ์ง€์ ์€ ์ธ์ ‘ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ทจ๊ธ‰ํ•œ๋‹ค). 

๋˜ํ•œ ์œ„์™€ ๊ฐ™์€ ์ง€์—ญ์—์„œ ๋†’์ด๊ฐ€ 6์ดํ•˜์ธ ์ง€์ ์„ ๋ชจ๋‘ ์ž ๊ธฐ๊ฒŒ ๋งŒ๋“œ๋Š” ๋งŽ์€ ๋น„๊ฐ€ ๋‚ด๋ฆฌ๋ฉด ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š๋Š” ์•ˆ์ „ํ•œ ์˜์—ญ์€ ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ์™€ ๊ฐ™์ด ๋„ค ๊ฐœ๊ฐ€ ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

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

์ด์™€ ๊ฐ™์ด ์žฅ๋งˆ์ฒ ์— ๋‚ด๋ฆฌ๋Š” ๋น„์˜ ์–‘์— ๋”ฐ๋ผ์„œ ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š๋Š” ์•ˆ์ „ํ•œ ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋Š” ๋‹ค๋ฅด๊ฒŒ ๋œ๋‹ค. ์œ„์˜ ์˜ˆ์™€ ๊ฐ™์€ ์ง€์—ญ์—์„œ ๋‚ด๋ฆฌ๋Š” ๋น„์˜ ์–‘์— ๋”ฐ๋ฅธ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค ์กฐ์‚ฌํ•ด ๋ณด๋ฉด ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š๋Š” ์•ˆ์ „ํ•œ ์˜์—ญ์˜ ๊ฐœ์ˆ˜ ์ค‘์—์„œ ์ตœ๋Œ€์ธ ๊ฒฝ์šฐ๋Š” 5์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

์–ด๋–ค ์ง€์—ญ์˜ ๋†’์ด ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์žฅ๋งˆ์ฒ ์— ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š๋Š” ์•ˆ์ „ํ•œ ์˜์—ญ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ์–ด๋–ค ์ง€์—ญ์„ ๋‚˜ํƒ€๋‚ด๋Š” 2์ฐจ์› ๋ฐฐ์—ด์˜ ํ–‰๊ณผ ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆ˜ N์ด ์ž…๋ ฅ๋œ๋‹ค. N์€ 2 ์ด์ƒ 100 ์ดํ•˜์˜ ์ •์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ๊ฐ ์ค„์—๋Š” 2์ฐจ์› ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ํ–‰๋ถ€ํ„ฐ N๋ฒˆ์งธ ํ–‰๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ํ–‰์”ฉ ๋†’์ด ์ •๋ณด๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค. ๊ฐ ์ค„์—๋Š” ๊ฐ ํ–‰์˜ ์ฒซ ๋ฒˆ์งธ ์—ด๋ถ€ํ„ฐ N๋ฒˆ์งธ ์—ด๊นŒ์ง€ N๊ฐœ์˜ ๋†’์ด ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ž์—ฐ์ˆ˜๊ฐ€ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ž…๋ ฅ๋œ๋‹ค. ๋†’์ด๋Š” 1์ด์ƒ 100 ์ดํ•˜์˜ ์ •์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์žฅ๋งˆ์ฒ ์— ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š๋Š” ์•ˆ์ „ํ•œ ์˜์—ญ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


 

๋ฐฑ์ค€ ์‹ค๋ฒ„1 ๋ฌธ์ œ.

๋น„๊ฐ€ 0๋งŒํผ ๋‚ด๋ฆฌ๋Š” ๊ฒฝ์šฐ๊นŒ์ง€ ํฌํ•จํ•ด์„œ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค

 

 

๋‚˜์˜ ํ’€์ด

#include <iostream>
#include <queue>
using namespace std;

int n;
int map[101][101];
int visited[101][101] = {0};
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int maxCnt = 0;

bool canGo(int rain, int x, int y){
    if(x<0 || y<0 || x>=n || y>=n) return false;
    if(visited[x][y]) return false;
    if(map[x][y]<=rain) return false;
    return true;
}

void bfs(int rain, int x, int y){
    queue<pair<int, int>> q;
    q.push({x, y});
    visited[x][y] = 1;
    while(!q.empty()){
        pair<int, int> a = q.front();
        q.pop();
        for (int i = 0; i < 4; ++i){
            int nx = a.first + dx[i];
            int ny = a.second + dy[i];
            if(canGo(rain,nx,ny)){
                q.push({nx, ny});
                visited[nx][ny] = 1;
            }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int maxi = 0;

    cin >> n;
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < n; ++j){
            cin >> map[i][j];
            if(maxi < map[i][j]) maxi = map[i][j];
        }
    }

    for (int rain = 0; rain < maxi; ++rain){
        int cnt = 0;
        for (int i = 0; i < n; ++i){
            for (int j = 0; j < n; ++j){
                if(visited[i][j]==0 && map[i][j]>rain){
                    bfs(rain,i,j);
                    cnt++;
                }
            }
        }
        if(maxCnt < cnt) maxCnt = cnt;
        for (int i = 0; i < n; ++i){ // visited ์ดˆ๊ธฐํ™”
            for (int j = 0; j < n; ++j){
                visited[i][j] = 0;
            }
        }
    }

    cout << maxCnt;
}