๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm ๐Ÿง‘๐Ÿป‍๐Ÿ’ป/CodeUp

4060: ์ „๊ด‘ํŒ ์ „๊ตฌ์กฐ์ž‘

by dkswnkk 2022. 1. 14.

๋ฌธ์ œ

 

์ „๊ด‘ํŒ ์ „๊ตฌ ์กฐ์ž‘

์ฒซ์งธ ์ค„์— ์ „๊ด‘ํŒ์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์„ธ๋กœ ๊ธธ์ด $M$๊ณผ ๊ฐ€๋กœ ๊ธธ์ด $N$์ด ์ž…๋ ฅ๋œ๋‹ค. ($2<=M,N<=100$์ธ ์ž์—ฐ์ˆ˜) ๋‘˜์งธ์ค„ ๋ถ€ํ„ฐ $M$์ค„์— ๊ฑธ์ณ $N$์—ด ๋งŒํผ์˜ ์ „๊ตฌ๋“ค์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ ์ผœ์ง„ ์ƒํƒœ๋Š” $1$, ๊บผ

codeup.kr

 

์ฝ”๋“œ

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

int N,M;

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

int right_on = 0,right_off=0;

void go_rignt_on(int x, int y){
    queue<pair<int,int>>q;
    q.push({x,y});
    visited[x][y]=1;
    
    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&&nx<N&&ny>=0&&ny<M){
                if(visited[nx][ny]||map[nx][ny]==1) continue;
                q.push({nx,ny});
                visited[nx][ny]=1;
            }
        }
    }
    right_on++;
}

void go_rignt_off(int x, int y){
    queue<pair<int,int>>q;
    q.push({x,y});
    visited[x][y]=1;
    
    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&&nx<N&&ny>=0&&ny<M){
                if(visited[nx][ny]||map[nx][ny]==0) continue;
                q.push({nx,ny});
                visited[nx][ny]=1;
            }
        }
    }
    right_off++;
}


int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    
    cin>>N>>M;
    
    for(int i=0; i<N; i++){
        for(int k=0; k<M; k++){
            cin>>map[i][k];
        }
    }
    
    for(int i=0; i<N; i++){
        for(int k=0; k<M; k++){
            if(map[i][k]==0&&!visited[i][k]) go_rignt_on(i,k);
        }
    }
    memset(visited,0,sizeof(0));
    for(int i=0; i<N; i++){
        for(int k=0; k<M; k++){
            if(map[i][k]==1&&!visited[i][k]) go_rignt_off(i,k);
        }
    }
    cout<<right_on<<' '<<right_off;
    
}

 

ํ’€์ด

๊ธฐ์ดˆ์ ์ธ DFS/BFS ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ์ „์›์„ ์ผค ๋•Œ์™€ ์ „์›์„ ๋Œ ๋•Œ ๊ฐ๊ฐ BFS๋ฅผ ๋Œ๋ ค์„œ BFS๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ดํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€