[c++] BOJ 3108 :: ๋กœ๊ณ 

๋ฌธ์ œ

๋กœ๊ณ ๋Š” ์ฃผ๋กœ ๊ต์œก์šฉ์— ์“ฐ์ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค. ๋กœ๊ณ ์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ๊ฑฐ๋ถ์ด ๋กœ๋ด‡์ธ๋ฐ, ์‚ฌ์šฉ์ž๋Š” ์ด ๊ฑฐ๋ถ์ด ๋กœ๋ด‡์„ ์›€์ง์ด๋Š” ๋ช…๋ น์„ ์ž…๋ ฅํ•ด ํ™”๋ฉด์— ๋„ํ˜•์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๊ฑฐ๋ถ์ด๋Š” ์œ„์น˜์™€ ๊ฐ๋„๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฑฐ๋ถ์ด๋Š” ์ž…์— ์—ฐํ•„์„ ๋ฌผ๊ณ  ์žˆ๋Š”๋ฐ, ์—ฐํ•„์„ ๋‚ด๋ฆฌ๋ฉด ์›€์ง์ผ ๋•Œ ํ™”๋ฉด์— ์„ ์„ ๊ทธ๋ฆฌ๊ณ , ์˜ฌ๋ฆฌ๋ฉด ์„ ์„ ๊ทธ๋ฆฌ์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ์ง€๋‚˜๊ฐ€๊ธฐ๋งŒ ํ•œ๋‹ค.

์ œ์ผ ์ฒ˜์Œ์— ๊ฑฐ๋ถ์ด๋Š” (0,0)์— ์žˆ๊ณ , ๊ฑฐ๋ถ์ด๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ์€ y์ถ•์ด ์ฆ๊ฐ€ํ•˜๋Š” ๋ฐฉํ–ฅ์ด๋‹ค. ๋˜ํ•œ ์—ฐํ•„์€ ๋‚ด๋ฆฌ๊ณ  ์žˆ๋‹ค.

์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์„ฏ๊ฐ€์ง€ ๋ช…๋ น์œผ๋กœ ๊ฑฐ๋ถ์ด๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. FD x: ๊ฑฐ๋ถ์ด๋ฅผ x๋งŒํผ ์•ž์œผ๋กœ ์ „์ง„
  2. LT a: ๊ฑฐ๋ถ์ด๋ฅผ ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ a๋„ ๋งŒํผ ํšŒ์ „
  3. RT a: ๊ฑฐ๋ถ์ด๋ฅผ ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ a๋„ ๋งŒํผ ํšŒ์ „
  4. PU: ์—ฐํ•„์„ ์˜ฌ๋ฆฐ๋‹ค
  5. PD: ์—ฐํ•„์„ ๋‚ด๋ฆฐ๋‹ค.

์ถ•์— ํ‰ํ–‰ํ•œ ์ง์‚ฌ๊ฐํ˜• N๊ฐœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด ์ง์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฌ๋Š”๋ฐ ํ•„์š”ํ•œ PU ๋ช…๋ น์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๊ฑฐ๋ถ์ด๋Š” ๊ฐ™์€ ์„ ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฌธ์ œ์— ์ฃผ์–ด์ง„ ์ง์‚ฌ๊ฐํ˜• N๊ฐœ๋ฅผ ์ œ์™ธํ•œ ์–ด๋–ค ๊ฒƒ๋„ ๊ทธ๋ฆด ์ˆ˜ ์—†๋‹ค. ๊ฑฐ๋ถ์ด์˜ ํฌ๊ธฐ๋Š” ์•„์ฃผ ์ž‘์•„์„œ ์ขŒํ‘œ ํ‰๋ฉด์˜ ํ•œ ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ์ง์‚ฌ๊ฐํ˜•์˜ ๋ณ€์€ ์ถ•์— ํ‰ํ–‰ํ•˜๋‹ค.

 

ํ’€์ด

  • ์ฒ˜์Œ์— ๋ฐ›์€ ์‚ฌ๊ฐํ˜• ๋ชจ๋‘ 1๋กœ ์น ํ•˜๊ธฐ
  • dfs ๋Œ๋ฉด์„œ ๊ฐ’์ด 1์ด๋ฉด 2๋กœ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ ์‹คํ–‰
    • ์ขŒํ‘œ์ƒ์œผ๋กœ๋Š” -500๊นŒ์ง€ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด 500์„ ๋”ํ•ด์ค˜์•ผ ํ•จ
    • dfs ๋Œ๋ ค๋ฉด ๋ฐ”๋กœ ์˜†์— ์žˆ๋Š” ์ ์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์œ„์น˜์— ๊ณฑํ•˜๊ธฐ 2ํ•ด์ฃผ์–ด์•ผ ํ•จ
  • ๊ฐ’์ด 0์ด๊ฑฐ๋‚˜ 2๋ฉด (์‚ฌ๊ฐํ˜•์ด ์•„๋‹ˆ๊ฑฐ๋‚˜, ๋“ค๋ฅธ ์‚ฌ๊ฐํ˜•์ด๋ฉด) ๊ฑด๋„ˆ๋›ฐ๊ธฐ
  • ํ•œ ๋ฒˆ loop ๋Œ ๋•Œ๋งˆ๋‹ค ํ•œ ๋ถ“์œผ๋กœ ๊ทธ๋ฆฐ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ result ๋Š˜๋ ค์ฃผ๊ธฐ
  • (0, 0)์—์„œ ์—ฐํ•„์„ ๋‚ด๋ฆฌ๊ณ  ์žˆ์œผ๋ฏ€๋กœ (0, 0)์— ๋“ค๋ฅธ ์ ์ด ์žˆ์œผ๋ฉด result-1 ํ•„์š”

 

์ฝ”๋“œ

#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <unordered_set>

using namespace std;

int N;
int map[2001][2001];
int groupNum = 0;
int result = 0;
int direction[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };

void checkMap(int minX, int maxX, int minY, int maxY, int group) { // O(n)
    // ์‚ฌ๊ฐํ˜• ๋‘˜๋ ˆ ์ฒดํฌํ•˜๋Š” ํ•จ์ˆ˜
    for (int j = minY; j <= maxY; j++) {
        map[maxX][j] = group;
        map[minX][j] = group;
    }
    for (int i = minX; i <= maxX; i++) {
        map[i][minY] = group;
        map[i][maxY] = group;
    }
}

void visitMap(int r, int c) { // dfs
    if (map[r][c] == 0 || map[r][c] == 2) return; // ์•ˆ ๋“ค๋Ÿฌ๋„ ๋˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๋“ค๋ €์œผ๋ฉด ํŒจ์Šค
    map[r][c] = 2;

    for (int i = 0; i < 4; i++) {
        int newR = direction[i][0] + r;
        int newC = direction[i][1] + c;

        if (newR < 0 || newC < 0 || newR > 2000 || newC > 2000) continue;
        visitMap(newR, newC);
    }
}


int main() {
    cin >> N;
    fill(&map[0][0], &map[2000][2001], 0);
    for (int i = 0; i < N; i++) { // O(n^2)
        int x, y, x2, y2;
        cin >> x >> y >> x2 >> y2;
        checkMap((x + 500) * 2, (x2 + 500) * 2, (y + 500) * 2, (y2 + 500) * 2, 1); // *2 + 500
    }

    for (int i = 0; i < 2001; i++) {
        for (int j = 0; j < 2001; j++) { // 10^6
            if (map[i][j] == 1) {
                visitMap(i, j);
                result++;
            }
        }
    }

    if (map[1000][1000] != 0) { // (0, 0)์—์„œ ์‹œ์ž‘ํ•˜๋Š”๊ฒŒ ์žˆ์œผ๋ฉด -1
        result--;
    }
    cout << result;
    cin >> N;
}

 

 

๊ฒฐ๊ณผ

๋ฌธ์ œ ๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„ ์ฝ”๋“œ ๊ธธ์ด
gmldms784 19280 20 1422
๋ฐ˜์‘ํ˜•