본문 바로가기
Algorithm/BOJ

원티드 쇼미더코드 3회차 - B번 도넛 행성

by Ellery 2023. 1. 15.

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

 

27211번: 도넛 행성

준겸이는 $N \times M$칸으로 이루어진 도넛 모양의 행성에 살고 있다. 준겸이가 살고 있는 행성에는 위 그림처럼 격자 모양으로 줄이 그어져 있다. 행성의 각 칸은 숲으로 막혀 있거나, 지나갈 수

www.acmicpc.net

그림만 보면 허걱하는데 내용을 보면 전형적인 2차원 배열 내에서의 연결 요소 문제이다. 
2차원 그리드 전체를 순회하면서 dfs 혹은 bfs 탐색으로 같은 구역으로 묶이는 지역들을 방문하면 된다.
다만 햇깔리는 점은 그리드 위아래, 왼쪽오른쪽이 서로 구 처럼 연결되어있으므로 그리드 범위를 넘어가면 반대지역으로 치환해주면 된다

#include <bits/stdc++.h>
using namespace std;
#define FASTIO cin.tie(nullptr)->sync_with_stdio(false)

int dr[] = {-1, 0, 1, 0};
int dc[] = {0, 1, 0, -1};

int n, m, a[1001][1001], d[1001][1001];

void dfs(int r, int c, int g) { //
    d[r][c] = g;

    for (int i = 0; i < 4; ++i) {
        int nr = r + dr[i];
        int nc = c + dc[i];

        if (nr < 0) nr = n - 1;
        if (nc < 0) nc = m - 1;
        if (nr >= n) nr = 0;
        if (nc >= m) nc = 0;
        if (d[nr][nc] != -1 || a[nr][nc] == 1) continue;
        dfs(nr, nc, g);
    }
}

int main() {
    FASTIO;
    memset(d, -1, sizeof(d));
    cin >> n >> m;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> a[i][j];
        }
    }

    int group = 0;
    for (int i = 0; i < n; ++i) {     // 세로
        for (int j = 0; j < m; ++j) { // 가로
            if (a[i][j] == 0 && d[i][j] == -1) dfs(i, j, ++group);
        }
    }

    cout << group;
    return 0;
}