[c++] BOJ 4195 :: ์นœ๊ตฌ ๋„คํŠธ์›Œํฌ

๋ฌธ์ œ

์นœ๊ตฌ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ฏผํ˜์ด๋Š” ์†Œ์…œ ๋„คํŠธ์›Œํฌ ์‚ฌ์ดํŠธ์—์„œ ์นœ๊ตฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” ์นœ๊ตฌ์ด๋‹ค. ์šฐํ‘œ๋ฅผ ๋ชจ์œผ๋Š” ์ทจ๋ฏธ๊ฐ€ ์žˆ๋“ฏ์ด, ๋ฏผํ˜์ด๋Š” ์†Œ์…œ ๋„คํŠธ์›Œํฌ ์‚ฌ์ดํŠธ์—์„œ ์นœ๊ตฌ๋ฅผ ๋ชจ์œผ๋Š” ๊ฒƒ์ด ์ทจ๋ฏธ์ด๋‹ค.

์–ด๋–ค ์‚ฌ์ดํŠธ์˜ ์นœ๊ตฌ ๊ด€๊ณ„๊ฐ€ ์ƒ๊ธด ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋‘ ์‚ฌ๋žŒ์˜ ์นœ๊ตฌ ๋„คํŠธ์›Œํฌ์— ๋ช‡ ๋ช…์ด ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์นœ๊ตฌ ๋„คํŠธ์›Œํฌ๋ž€ ์นœ๊ตฌ ๊ด€๊ณ„๋งŒ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ด๋ฅผ ๋งํ•œ๋‹ค.

 

ํ’€์ด

ํŠน์ • ์ด๋ฆ„์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ํ•ด๋‹น ์ด๋ฆ„์ด ์†ํ•œ ๊ทธ๋ฃน์„ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ณ , ํ•ด๋‹น ๊ทธ๋ฃน์— ์žˆ๋Š” ์ด๋ฆ„์˜ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ด๋ฆ„์ด ์†ํ•œ ๊ทธ๋ฃน์„ ๋ฐ”๋กœ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” map<string, int>๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ๊ทธ๋ฃน์— ์žˆ๋Š” ์ด๋ฆ„์˜ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  1. set<string> group[n]์œผ๋กœ ํŠน์ • idx ๊ทธ๋ฃน์— ์†ํ•˜๋Š” ๋ชจ๋“  ์ด๋ฆ„์€ ์ €์žฅํ•ด๋‘˜ ์ˆ˜ ์žˆ๋‹ค.
  2. ๋‹ค๋ฅธ set๋“ค์˜ ๊ด€๊ณ„๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž…๋ ฅ์ด ์ฃผ์–ด์กŒ๋‹ค๊ณ  ํ•˜์ž.

1
5
a b // ๊ทธ๋ฃน 1: a b
b c // ๊ทธ๋ฃน 1: a b c
c a // ๊ทธ๋ฃน 1: a b c
i j // ๊ทธ๋ฃน 1: a b c, ๊ทธ๋ฃน 2: i j
j a // ๊ทธ๋ฃน 1: a b c i j

1๋ฒˆ์˜ ๋ฐฉ์‹์œผ๋กœ ํ•˜๋ฉด j a ์ž…๋ ฅ์ด ๋“ค์–ด์™”์„ ๋•Œ

  • ๊ธฐ์กด์˜ ๊ทธ๋ฃน 1์— ๊ทธ๋ฃน 2์˜ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ๋„ฃ์–ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ๋˜ํ•œ, ๊ทธ๋ฃน 1๋กœ ํ•ฉ์ณ์กŒ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด i์™€ j์— ๋Œ€ํ•ด์„œ๋Š” map[i] = map[j] = 1;๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ™์€ ๊ทธ๋ฃน์— ์†ํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•ด์„œ map์„ ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์ฒซ๋ฒˆ์งธ ๋ฌธ์ œ์ ์€ ์–ด์ฐจํ”ผ ๊ทธ๋ฃน์˜ ์‚ฌ์ด์ฆˆ๋งŒ์„ ๋ฌป๋Š” ๋ฌธ์ œ์˜ ํŠน์„ฑ์„ ์ด์šฉํ•˜์—ฌ set์ด ์•„๋‹Œ int ํ˜•์œผ๋กœ ๋ฐ”๊ฟ”์„œ ์ˆซ์ž๋งŒ ๋”ํ•ด์ฃผ๋Š” ์‹์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‘๋ฒˆ์งธ ๋ฌธ์ œ์ ์€ ๊ฐ™์€ ๊ทธ๋ฃน์— ์†ํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•ด map์„ ์ˆ˜์ •ํ•˜๊ธฐ๋ณด๋‹ค parent๋ผ๋Š” ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด์„œ ๊ทธ๋ฃน ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•ด์คŒ์œผ๋กœ์จ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ ์ƒํ™ฉ์—์„œ parent[2] = 1;์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ฒฐ๊ตญ j a ์ž…๋ ฅ์ด ๋“ค์–ด์™”์„ ๋•Œ, j๊ฐ€ ์†ํ•œ ๊ทธ๋ฃน์˜ ์ตœ์ƒ์œ„ ๋ถ€๋ชจ๋ฅผ ์ฐพ๊ณ (2) a๊ฐ€ ์†ํ•œ ๊ทธ๋ฃน์˜ ์ตœ์ƒ์œ„ ๋ถ€๋ชจ(1)๋ฅผ ์ฐพ์•„์„œ ๋‘ ๊ทธ๋ฃน์„ ํ•ฉ์นœ ๋’ค ๋‚˜๋จธ์ง€ ํ•œ ๊ทธ๋ฃน์˜ ๋ถ€๋ชจ๋ฅผ ํ•ด๋‹น ๊ทธ๋ฃน์œผ๋กœ ํ• ๋‹นํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ฒ˜์Œ ๊ทธ๋ฃน์„ ์ƒ์„ฑ๋  ๋•Œ์™€ ๊ฐ™์ด ๊ณ ๋ คํ•ด์•ผํ•˜๋Š” ์‚ฌํ•ญ ๋” ์žˆ์ง€๋งŒ ์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด์ž.

 

์ฝ”๋“œ

#include <iostream>
#include <string>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
map<string, int> friendMap; // ๊ฐ ์ด๋ฆ„์ด ์†ํ•œ ๊ทธ๋ฃน
int friendGroup[100001] = { 1, 0, }; // ํ•ด๋‹น ๊ทธ๋ฃน์˜ ์š”์†Œ ์ˆ˜
int parent[100001]; // ๊ฐ ๊ทธ๋ฃน์˜ ๋ถ€๋ชจ
int groupSize = 1;

int findParent(int chlidGroup) { // find parent
    if (parent[chlidGroup] == chlidGroup) {
        // ์ตœ์ƒ์œ„ ๋ถ€๋ชจ์ด๋ฉด
        return chlidGroup;
    }
    return findParent(parent[chlidGroup]);
}

int unionGroup(int group1, int group2) {
    int parentGroup = max(group1, group2);
    int childGroup = min(group1, group2);

    friendGroup[parentGroup] += friendGroup[childGroup];
    if (childGroup != 0) {
        parent[childGroup] = parentGroup;
    }

    return parentGroup;
}

int initGroup(int group) {
    friendGroup[group] = 2;
    parent[group] = group; // ์ฒ˜์Œ์—” ์ž๊ธฐ ์ž์‹ ์ด ๋ถ€๋ชจ
    return group;
}

int main() {
    ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);

    int T; cin >> T;
    while (T--) {
        friendMap.clear();

        int num; cin >> num;
        while (num--) { // 10^5
            string p1, p2;
            cin >> p1 >> p2;

            int p1Group = findParent(friendMap[p1]);
            int p2Group = findParent(friendMap[p2]);

            int group, anotherGroup;

            if (p1Group == p2Group) { // ๊ฐ™์€ ๊ทธ๋ฃน์— ์†ํ•ด์žˆ์œผ๋ฉด
                if (p1Group != 0) {
                    cout << friendGroup[p1Group] << '\n';
                    continue;
                }

                // ๋‘˜ ๋‹ค ์ฒ˜์Œ์ด๋ฉด
                group = initGroup(groupSize++);
            }
            else {
                // ๋‹ค๋ฅด๋ฉด ํ•ฉ์น˜๊ธฐ
                group = unionGroup(p1Group, p2Group);
            }

            friendMap[p1] = friendMap[p2] = group;
            cout << friendGroup[group] << '\n';
        }
    }
}

 

๊ฒฐ๊ณผ

๋ฌธ์ œ ๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„ ์ฝ”๋“œ ๊ธธ์ด
4195 18520 244 1904
๋ฐ˜์‘ํ˜•

'Algorithm ๋ฌธ์ œ > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[c++] BOJ 1501 :: ์˜์–ด ์ฝ๊ธฐ  (0) 2021.10.07
[c++] BOJ 1253 :: ์ข‹๋‹ค  (0) 2021.09.28
[c++] BOJ 5430 :: AC  (0) 2021.09.07
[c++] BOJ 14725 :: ๊ฐœ๋ฏธ๊ตด  (0) 2021.09.07
[c++] BOJ 3108 :: ๋กœ๊ณ   (0) 2021.08.31