www.acmicpc.net/problem/4963

 

4963번: 섬의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도�

www.acmicpc.net


  • DFS 를 통해 간단하게 풀 수 있는 문제이다.
  • w 가 열의 갯수, h 가 행의 갯수인데 이를 반대로 써서 헷갈렸을 뿐..

#include <iostream>

using namespace std;

int w, h;
int map[50][50];
int dir[3] = {-1, 0, 1};

void dfs(int row, int col)                              // dfs 로 섬 하나씩 처리
{
    if(0 <= row && row < w && 0 <= col && col < h)
        if(map[row][col] == 1)
        {
            map[row][col] = 0;
            for(int r = 0 ; r < 3 ; r++)                // 가로, 세로, 대각선으로 이어진 땅들 하나로 묶음
                for(int c = 0 ; c < 3 ; c++)
                    dfs(row + dir[r], col + dir[c]);
        }
}

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

    while (true)
    {
        cin >> h >> w;
        if(w == 0 && h == 0) break;

        int answer = 0;
        for(int r = 0 ; r < w ; r++)
            for(int c = 0 ; c < h ; c++)
                cin >> map[r][c];

        for(int r = 0 ; r < w ; r++)
            for(int c = 0 ; c < h ; c++)                // 아직 방문하지 않은 땅이 있다면
                if(map[r][c] == 1)                      // 해당 땅에 속하는 섬을 하나로 묶어서 셈
                {
                    answer++;
                    dfs(r, c);
                }

        cout << answer << '\n';
    }
}

'PS > BOJ' 카테고리의 다른 글

[백준] 9934 : 완전 이진 트리  (0) 2020.09.16
[백준] 2468 : 안전 영역  (0) 2020.09.15
[백준] 19844 : 단어 개수 세기  (0) 2020.09.13
[백준] 2156.cpp : 포도주 시식  (0) 2020.09.11
[백준] 1904.cpp : 01타일  (0) 2020.09.09

+ Recent posts