Algorithm

[๋ฐฑ์ค€ 2583] ์˜์—ญ ๊ตฌํ•˜๊ธฐ

osean 2023. 5. 11. 02:10

๋ฌธ์ œ

 

2583๋ฒˆ: ์˜์—ญ ๊ตฌํ•˜๊ธฐ

์ฒซ์งธ ์ค„์— M๊ณผ N, ๊ทธ๋ฆฌ๊ณ  K๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค. M, N, K๋Š” ๋ชจ๋‘ 100 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ K๊ฐœ์˜ ์ค„์—๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ง์‚ฌ๊ฐํ˜•์˜ ์™ผ์ชฝ ์•„๋ž˜ ๊ผญ์ง“์ ์˜ x, y์ขŒํ‘œ๊ฐ’๊ณผ ์˜ค

www.acmicpc.net

๋ˆˆ๊ธˆ์˜ ๊ฐ„๊ฒฉ์ด 1์ธ M×N(M,N≤100)ํฌ๊ธฐ์˜ ๋ชจ๋ˆˆ์ข…์ด๊ฐ€ ์žˆ๋‹ค. ์ด ๋ชจ๋ˆˆ์ข…์ด ์œ„์— ๋ˆˆ๊ธˆ์— ๋งž์ถ”์–ด K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆด ๋•Œ, ์ด๋“ค K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜•์˜ ๋‚ด๋ถ€๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์ด ๋ช‡ ๊ฐœ์˜ ๋ถ„๋ฆฌ๋œ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด M=5, N=7 ์ธ ๋ชจ๋ˆˆ์ข…์ด ์œ„์— <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ™์ด ์ง์‚ฌ๊ฐํ˜• 3๊ฐœ๋ฅผ ๊ทธ๋ ธ๋‹ค๋ฉด, ๊ทธ ๋‚˜๋จธ์ง€ ์˜์—ญ์€ <๊ทธ๋ฆผ 2>์™€ ๊ฐ™์ด 3๊ฐœ์˜ ๋ถ„๋ฆฌ๋œ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง€๊ฒŒ ๋œ๋‹ค.

M, N๊ณผ K ๊ทธ๋ฆฌ๊ณ  K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜•์˜ ์ขŒํ‘œ๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜• ๋‚ด๋ถ€๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์ด ๋ช‡ ๊ฐœ์˜ ๋ถ„๋ฆฌ๋œ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง€๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ถ„๋ฆฌ๋œ ๊ฐ ์˜์—ญ์˜ ๋„“์ด๊ฐ€ ์–ผ๋งˆ์ธ์ง€๋ฅผ ๊ตฌํ•˜์—ฌ ์ด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

ํ’€์ด

์ฒดํฌ ํฌ์ธํŠธ 1

์ฒ˜์Œ์—๋Š” ์ฃผ์–ด์ง„ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์ขŒ์ธก ํ•˜๋‹จ ์ขŒํ‘œ๋ถ€ํ„ฐ ์šฐ์ธก ์ƒ๋‹จ ์ขŒํ‘œ ์‚ฌ์ด์— ํฌํ•จ๋œ ๋ชจ๋“  ์ขŒํ‘œ์— ํ”Œ๋ž˜๊ทธ ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ์—ˆ๋‹ค.

์œ„์™€ ๊ฐ™์ด ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ์„ ๋•Œ, ์ง์‚ฌ๊ฐํ˜•๊ณผ ๋งˆ์ฃผํ•˜๋Š” ์˜์—ญ์˜ ๋ชจ์„œ๋ฆฌ๊ฐ€ ๊ฒน์น˜๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ง์‚ฌ๊ฐํ˜•์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ธ์šธ ๋•Œ, ์˜ˆ์‹œ ์ด๋ฏธ์ง€์˜ ๋ชจ์„œ๋ฆฌ๋งˆ๋‹ค ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ธ์šฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ„์„  ํ•˜๋‚˜๋ฅผ ์ค„์—ฌ ์ •์‚ฌ๊ฐํ˜•์ด ์ด์–ด์ง„ ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ ๋ผ์ธ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

๋ผ์ธ ํ˜•ํƒœ๋กœ ์ค„์ธ๋‹ค๋Š” ๋ง์€, ์ฃผ์–ด์ง„ ์ง์‚ฌ๊ฐํ˜• ์ขŒํ‘œ๋ฅผ ๋งŒ๋“ค ๋•Œ ์ด์ค‘ for ๋ฌธ์„ ์šฐ์ธก ์ƒ๋‹จ ์ขŒํ‘œ ์ด์ „๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ผ๋ฐ˜์ ์ธ DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ง์‚ฌ๊ฐํ˜• ์ด์™ธ์˜ ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฒดํฌ ํฌ์ธํŠธ 2

์ง์‚ฌ๊ฐํ˜• ์ด์™ธ์˜ ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•… ํ–ˆ๋‹ค๋ฉด ํ•ด๋‹น ์˜์—ญ์— ํฌํ•จ๋œ ์ ‘์ ์˜ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•ด์•ผ ํ•œ๋‹ค.

๋‚˜๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๋Œ ๋•Œ ํ•ด๋‹น ๊ฐ’์„ ๋”ํ•˜๊ณ  ์žฌ๊ท€ ๋‚ด๋ถ€์—์„œ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ๋Œ๋ฉฐ ํ˜ธ์ถœํ•˜๋Š” dfs() ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์„

์ตœ์ดˆ ํ˜ธ์ถœํ•œ dfs() ์—์„œ ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๊ณ  ๋ฆฌํ„ดํ•˜๋„๋ก ํ•˜๋ฉด ํ•ด๋‹น ์˜์—ญ์— ํฌํ•จ๋œ ์ ‘์ ์˜ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

๋ฉ”๋ชจ

์ฒ˜์Œ์— ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋Š” ์–ด์ฐŒ์ €์ฐŒ ํ’€๋ฆด ๋“ฏ ํ•˜๋‹ค๊ฐ€๋„ ์˜๋„ํ•œ๋Œ€๋กœ ์ฝ”๋“œ๊ฐ€ ๋Œ์•„๊ฐ€์ง€ ์•Š์•„์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์ƒˆ๋กœ ์ž‘์„ฑ ํ–ˆ๋Š”๋ฐ, ์—ญ์‹œ ๊ธ‰ํ•  ์ˆ˜๋ก ๋Œ์•„๊ฐ€๋ผ๋Š” ๋ง์ด ๋งž๋Š” ๋“ฏ ํ•˜๋‹ค.

์กฐ๊ธˆ ๋ง‰ํž ๋•Œ๋Š” ๊ธ‰ํ•˜์ง€ ์•Š๊ฒŒ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฝ์–ด๋ณด๋„๋ก ํ•˜์ž.

#include <bits/stdc++.h>
using namespace std;

int m, n, k;
int adj[104][104], visited[104][104];
int dy[] = {-1, 0, 1, 0};
int dx[] = {0, 1, 0, -1};

int dfs(int y, int x, int c) {
    visited[y][x] = 1;
    for (int i = 0; i < 4; i++) {
        int ny = y + dy[i];
        int nx = x + dx[i];
        if (ny < 0 || nx < 0 || ny >= m || nx >= n) continue;
        if (!adj[ny][nx] && !visited[ny][nx]) {
            c = dfs(ny, nx, ++c);
        }
    }
    return c;
}

int main() {
    cin >> m >> n >> k;
    for (int i = 0; i < k; i++) {
        int corner[4];
        for (int j = 0; j < 4; j++) cin >> corner[j];

        for (int y = corner[1]; y < corner[3]; y++) {
            for (int x = corner[0]; x < corner[2]; x++) {
                adj[y][x] = 1;
            }
        }
    }
    int cnt = 0;
    vector<int> areas;
    for (int y = 0; y < m; y++) {
        for (int x = 0; x < n; x++) {
            if (!adj[y][x] && !visited[y][x]) {
                cnt++;
                areas.push_back(dfs(y, x, 1));
            }
        }
    }
    sort(areas.begin(), areas.end());
    cout << cnt << '\n';
    for (int area : areas) {
        cout << area << " ";
    }
}