πŸ’  Cpp/λ„ˆλΉ„ μ™„μ „ 탐색

[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;
    }
}
λ°˜μ‘ν˜•