๐Ÿ’  BOJ/๋„ˆ๋น„ ์™„์ „ ํƒ์ƒ‰

[BOJ][C++] ๋ฐฑ์ค€ 4963๋ฒˆ: ์„ฌ์˜ ๊ฐœ์ˆ˜

์„ ๋‹ฌ 2023. 11. 17. 10:57
๋ฐ˜์‘ํ˜•

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

 

4963๋ฒˆ: ์„ฌ์˜ ๊ฐœ์ˆ˜

์ž…๋ ฅ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” ์ง€๋„์˜ ๋„ˆ๋น„ w์™€ ๋†’์ด h๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. w์™€ h๋Š” 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์–‘์˜ ์ •์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ h๊ฐœ ์ค„์—๋Š” ์ง€๋„

www.acmicpc.net

 

๋ฌธ์ œ

์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š” ์„ฌ๊ณผ ๋ฐ”๋‹ค ์ง€๋„๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์„ฌ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

ํ•œ ์ •์‚ฌ๊ฐํ˜•๊ณผ ๊ฐ€๋กœ, ์„ธ๋กœ ๋˜๋Š” ๋Œ€๊ฐ์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์‚ฌ๊ฐํ˜•์€ ๊ฑธ์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๊ฐํ˜•์ด๋‹ค. 

๋‘ ์ •์‚ฌ๊ฐํ˜•์ด ๊ฐ™์€ ์„ฌ์— ์žˆ์œผ๋ ค๋ฉด, ํ•œ ์ •์‚ฌ๊ฐํ˜•์—์„œ ๋‹ค๋ฅธ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๊ฑธ์–ด์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ง€๋„๋Š” ๋ฐ”๋‹ค๋กœ ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์žˆ์œผ๋ฉฐ, ์ง€๋„ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐˆ ์ˆ˜ ์—†๋‹ค.

์ž…๋ ฅ

์ž…๋ ฅ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” ์ง€๋„์˜ ๋„ˆ๋น„ w์™€ ๋†’์ด h๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. w์™€ h๋Š” 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์–‘์˜ ์ •์ˆ˜์ด๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ h๊ฐœ ์ค„์—๋Š” ์ง€๋„๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. 1์€ ๋•…, 0์€ ๋ฐ”๋‹ค์ด๋‹ค.

์ž…๋ ฅ์˜ ๋งˆ์ง€๋ง‰ ์ค„์—๋Š” 0์ด ๋‘ ๊ฐœ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ, ์„ฌ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

 

dfs ๋ฌธ์ œ๋ผ์„œ ํ’€์ด๋ฒ•๋งŒ ์•Œ๋ฉด ๊ธˆ๋ฐฉ ํ’€ ์ˆ˜ ์žˆ๋‹ค

ํ•„์ž๋Š” ๋ฒกํ„ฐ๋ฅผ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ด์„œ ์ž…๋ ฅ๋ฐ›์€ ์ง€๋„ ๋ฒกํ„ฐ์— ๋ฐ”๋กœ ์„ฌ์„ ํ‘œ์‹œํ–ˆ๋‹ค.

๋•…์ด 1๋กœ ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ 2๋ถ€ํ„ฐ ์นด์šดํŒ…ํ•˜๊ณ  ๋ฆฌํ„ดํ•  ๋•Œ 1์„ ๋นผ์ฃผ์—ˆ๋‹ค

// ํ’€์ด : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

typedef pair<int,int> ci;

int dx[8] = {0,0,-1,1,1,-1,1,-1};
int dy[8] = {1,-1,0,0,-1,1,1,-1};

int w,h;

int solution(vector<vector<int>>&v) {
    int cnt = 1;
    
    for(int i=0; i<h; i++) {
        for(int j=0; j<w; j++) {
            
            if(v[i][j]!=1) continue;

            cnt++;
            queue<ci> q;
            q.push({i,j});
            
            while(!q.empty()) {
                ci cur = q.front();
                q.pop();
                for(int dir=0; dir<8; dir++) {
                    int x = cur.first + dir[dx];
                    int y = cur.second + dir[dy];
                
                    if(x<0 || x>=h || y<0 || y>=w) continue;
                    if(v[x][y]!=1) continue;
                
                    v[x][y] = cnt;
                    q.push({x,y});
                }
            }
        }
    }
    
    return cnt-1;
}

int main() {
    cin >> w >> h;
    while(!(w==0 && h==0)) {
        vector<vector<int>> v(h, vector<int>(w));
        for(int i=0; i<h; i++) {
            for(int j=0; j<w; j++) {
                cin >> v[i][j];
            }
        }
        
        cout << solution(v) << "\n";

        cin >> w >> h;
    }
}
๋ฐ˜์‘ํ˜•