🧩 Algorithm/[BOJ] Silver

BOJ 4963번 : μ„¬μ˜ 개수 (C++/Silver 2)

devCloud 2022. 10. 4. 00:44
728x90
 

4963번: μ„¬μ˜ 개수

μž…λ ₯은 μ—¬λŸ¬ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” μ§€λ„μ˜ λ„ˆλΉ„ w와 높이 hκ°€ μ£Όμ–΄μ§„λ‹€. w와 hλŠ” 50보닀 μž‘κ±°λ‚˜ 같은 μ–‘μ˜ μ •μˆ˜μ΄λ‹€. λ‘˜μ§Έ 쀄뢀터 h개 μ€„μ—λŠ” 지도

www.acmicpc.net

문제

μ •μ‚¬κ°ν˜•μœΌλ‘œ 이루어져 μžˆλŠ” 섬과 λ°”λ‹€ 지도가 μ£Όμ–΄μ§„λ‹€. μ„¬μ˜ 개수λ₯Ό μ„ΈλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

ν•œ μ •μ‚¬κ°ν˜•κ³Ό κ°€λ‘œ, μ„Έλ‘œ λ˜λŠ” λŒ€κ°μ„ μœΌλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ” μ‚¬κ°ν˜•μ€ κ±Έμ–΄κ°ˆ 수 μžˆλŠ” μ‚¬κ°ν˜•μ΄λ‹€.
두 μ •μ‚¬κ°ν˜•μ΄ 같은 섬에 있으렀면, ν•œ μ •μ‚¬κ°ν˜•μ—μ„œ λ‹€λ₯Έ μ •μ‚¬κ°ν˜•μœΌλ‘œ κ±Έμ–΄μ„œ 갈 수 μžˆλŠ” κ²½λ‘œκ°€ μžˆμ–΄μ•Ό ν•œλ‹€. μ§€λ„λŠ” λ°”λ‹€λ‘œ λ‘˜λŸ¬μ‹Έμ—¬ 있으며, 지도 λ°–μœΌλ‘œ λ‚˜κ°ˆ 수 μ—†λ‹€.


μž…λ ₯

μž…λ ₯은 μ—¬λŸ¬ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” μ§€λ„μ˜ λ„ˆλΉ„ w와 높이 hκ°€ μ£Όμ–΄μ§„λ‹€. w와 hλŠ” 50보닀 μž‘κ±°λ‚˜ 같은 μ–‘μ˜ μ •μˆ˜μ΄λ‹€. λ‘˜μ§Έ 쀄뢀터 h개 μ€„μ—λŠ” 지도가 μ£Όμ–΄μ§„λ‹€. 1은 λ•…, 0은 바닀이닀. μž…λ ₯의 λ§ˆμ§€λ§‰ μ€„μ—λŠ” 0이 두 개 μ£Όμ–΄μ§„λ‹€.


좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, μ„¬μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.


예제 μž…λ ₯

5 4
1 0 1 0 0
1 0 0 0 0
1 0 1 0 1
1 0 0 1 0
5 4
1 1 1 0 1
1 0 1 0 1
1 0 1 0 1
1 0 1 1 1
5 5
1 0 1 0 1
0 0 0 0 0
1 0 1 0 1
0 0 0 0 0
1 0 1 0 1
0 0

예제 좜λ ₯

3
1
9

μ„€λͺ…

1이면 섬, 0은 λ°”λ‹€λ‹€. 섬이 λŒ€κ°μ„  μ•„λ‹ˆλ©΄ μƒν•˜μ’Œμš°λ‘œ μ΄μ–΄μ ΈμžˆμœΌλ©΄ 그게 ν•˜λ‚˜μ˜ 섬이닀. κ·Έ μ„¬μ˜ 개수λ₯Ό λ°˜ν™˜ν•˜λ©΄ λœλ‹€.

풀이

Solution

#include <iostream>
using namespace std;
#define MAX 50

int w, h, island[MAX][MAX], result;
int dx[8] = { 1, 1, 0, -1, -1, -1, 0, 1 }; //μ’Œν‘œ (0,0)μ—μ„œ μ‹œκ³„λ°©ν–₯으둜 μ°¨λ‘€λ‘œ 적은 것
int dy[8] = { 0, -1, -1, -1, 0, 1, 1, 1 };
bool visited[MAX][MAX];

void DFS(int y, int x) {
    visited[y][x] = true; //λ°©λ¬Έ ν‘œμ‹œ
    for (int i = 0; i < 8; i++) {
        //μ£Όμœ„ μ’Œν‘œ 탐색
        int nx = dx[i] + x;
        int ny = dy[i] + y;
        //μ •μ‚¬κ°ν˜• λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λ©΄ λ¬΄μ‹œ
        if (nx < 0 || nx >= w || ny < 0 || ny >= h)
            continue;
        //섬인데 λ°©λ¬Έ μ•ˆ ν–ˆμœΌλ©΄ DFS 탐색 (island[y][x]λŠ” μ’Œν‘œκ°€ μ•„λ‹ˆλΌ ν–‰λ ¬μž„)
        if (island[ny][nx] == 1 && visited[ny][nx] == 0) { 
            DFS(ny, nx);
        }
    }
}
void reset() { //μ΄ˆκΈ°ν™”
    for (int j = 0; j < h; j++) {
        for (int i = 0; i < w; i++) {
            visited[j][i] = 0;
            island[j][i] = 0;
        }
    }
}
int main() {
    while (true) {
        cin >> w >> h;
        if (w == 0 && h == 0) //0 0이 μž…λ ₯되면 μ’…λ£Œ
            return 0;
        for (int j = 0; j < h; j++) {
            for (int i = 0; i < w; i++)
                cin >> island[j][i];
        }
        for (int y = 0; y < h; y++) { 
            for (int x = 0; x < w; x++) {
                //섬인데 λ°©λ¬Έ μ•ˆ ν–ˆμœΌλ©΄ DFS 탐색 ν›„ 섬 개수 카운트
                if (island[y][x] == 1 && visited[y][x] == 0) {
                    DFS(y, x);
                    result++;
                }
            }
        }
        cout << result << '\n';
        //μƒˆλ‘œ μž…λ ₯되기 λ•Œλ¬Έμ— 섬 κ°œμˆ˜μ™€ λ°©λ¬Έν‘œμ‹œ μ΄ˆκΈ°ν™” μ‹œμΌœμ•Ό 함
        result = 0;
        reset();
    }
}
728x90