๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[BOJ] 3098๋ฒˆ. ์†Œ์…œ๋„คํŠธ์›Œํฌ (C++)

by ์œ ๋ฏธ๋ฏธYoomimi 2023. 8. 4.

 

ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋Š” ๋‹ค ๋งŒ์กฑํ•˜๋Š”๋ฐ ์ž๊พธ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค๊ฐ€ ๋– ์„œ ์งฌ์งฌ์ด 3์ผ์— ๊ฑฐ์ณ ๋งžํ˜€๋‚ธ ๋ฌธ์ œ..

์ฒ˜์Œ์— ์ƒ๊ฐํ–ˆ๋˜ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์€ ๊ณ ์ง‘ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์„ ๋งŽ์ด ๋‚ ๋ ธ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ๊ทธ๋Ÿฌ์ง€ ๋งˆ์„ธ์š”..

 

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์•„์ด๋””์–ด๋Š”

๋Œ€์นญ ๊ตฌ์กฐ๋กœ ์นœ๊ตฌ ๊ด€๊ณ„๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์•Œ์•„๋ณด์ž.

 

์˜ˆ์ œ 1์„ ๋ณด๋ฉด ์ฒซ ์ค„์— 3(๋ช…) 2(๊ฐ€์ง€ ๊ด€๊ณ„๋ฅผ ์ž…๋ ฅํ•  ์˜ˆ์ •)์ด ๋‚˜ํƒ€๋‚˜์žˆ๋‹ค.

๊ทธ ์•„๋ž˜ 1๊ณผ 2๊ฐ€ ์นœ๊ตฌ, 2์™€ 3์ด ์นœ๊ตฌ์ธ ์ƒํƒœ๋ผ๊ณ  ์•Œ๋ ค์ฃผ๊ณ  ์žˆ๋‹ค.

 

์ด๋ฅผ 3x3๋ฐฐ์—ด์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

  ์‚ฌ๋žŒ1 ์‚ฌ๋žŒ2 ์‚ฌ๋žŒ3
์‚ฌ๋žŒ1 X(์นœ๊ตฌ์•„๋‹˜) O(์นœ๊ตฌ์ž„) X
์‚ฌ๋žŒ2 O X O
์‚ฌ๋žŒ3 X O X

 

1๊ณผ 3์ด ์นœ๊ตฌ๋ฉด 3๊ณผ 1๋„ ๋‹น์—ฐํžˆ ์นœ๊ตฌ์ธ ๊ฒƒ์ด๋‹ˆ ์œ„์™€ ๊ฐ™์ด ๋Œ€๊ฐ์„  ๋Œ€์นญ์ธ ํ‘œ๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

์ด ์›๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

#include <iostream>
#include <vector>
#include <unordered_set>

using namespace std;

int main() {
    int N, M;
    cin >> N >> M;
    vector<unordered_set<int>> social(N + 1);
    for (int i=0 ; i<M ; i++){
        int A, B;
        cin >> A >> B;
        social[A].insert(B);
        social[B].insert(A);
    }

    vector<int> day;
    int check = M*2;

    while (check < (N * (N - 1)) -1) {
        int tmp =0;
        vector<unordered_set<int>> m = social;
        for (int i = 1; i <= N; i++) {
            for (int z : social[i]) {
                for (int k : social[z]) {
                    if ((i != k) && (social[i].find(k) == social[i].end()) && (m[i].find(k)==m[i].end())){
                        m[i].insert(k);
                        tmp += 1;
                        check += 1;
                    }
                }
            }
        }
        for (int j=1 ; j<=N;j++)social[j].insert(m[j].begin(),m[j].end());
        day.push_back(tmp/2);
    }

    cout << day.size() << endl;
    for (int value : day) cout << value << endl;
    return 0;

}

social์€ ๋ฒกํ„ฐ๋‹ค. ์•ˆ์— unsigned_set์„ ๋‹ด๊ณ  ์žˆ๋‹ค.

social ๋ฒกํ„ฐ์˜ [k]๋ฒˆ์งธ ์š”์†Œ๋Š” k๋ฒˆ์งธ ์‚ฌ๋žŒ์˜ ์นœ๊ตฌ ๋ชฉ๋ก์„ ๋‹ด๊ณ  ์žˆ๋‹ค.
์นœ๊ตฌ ๋ชฉ๋ก์—๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ํ•„์š”์—†์œผ๋ฏ€๋กœ unsigned_set์œผ๋กœ ์ •์˜ํ–ˆ๋‹ค. vector๋กœ ์ •์˜ํ–ˆ์„ ๋•Œ๋ณด๋‹ค ํƒ์ƒ‰๋„ ๋” ๋น ๋ฅด๋‹ค.

 


while ๋ฌธ ์•ˆ์—์„œ๋Š” m์ด๋ผ๋Š” social์˜ ๋ณต์ œ ๋ฒกํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ,
์™œ๋ƒํ•˜๋ฉด social์—์„œ ์ƒˆ ์นœ๊ตฌ ๊ด€๊ณ„๋ฅผ ์ฐพ์•„๋‚ด๋ฉด์„œ ๋™์‹œ์— ์ƒˆ ์นœ๊ตฌ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋ฉด
๋ฌด์กฐ๊ฑด ํ•˜๋ฃจ๋งŒ์— ์นœ๊ตฌ ๊ด€๊ณ„๊ฐ€ ์ „๋ถ€ ๋งบ์–ด์ง€๊ฒŒ ๋˜๋ฏ€๋กœ ํ‹€๋ฆฐ ํ’€์ด๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๊ฒฐ๊ตญ ํ•˜๋ฃจ ์•ˆ์— ์ผ์–ด๋‚œ ์นœ๊ตฌ ๊ด€๊ณ„๋ผ๋ฆฌ๋Š” ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ๋ฉด ์•ˆ ๋˜๋‹ˆ

๋ฒกํ„ฐ m์— ํ•˜๋ฃจ ์•ˆ์— ์ƒ๊ฒจ๋‚œ ์นœ๊ตฌ ๊ด€๊ณ„๋ฅผ ๋‹ด์€ ๋‹ค์Œ m์ด ๋ชจ๋‘ ๋ชจ์ด๋ฉด ๊ทธ m์„ social์— ์—…๋ฐ์ดํŠธํ–ˆ๋‹ค.

 

์•„๋ž˜ if๋ฌธ์„ ์‚ดํŽด๋ณด์ž.

while๋ฌธ์€ i์˜ ์นœ๊ตฌ z์˜ ์นœ๊ตฌ k๋ฅผ i์˜ ์นœ๊ตฌ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ์ฝ”๋“œ๋‹ค. ์ด๋•Œ k๊ฐ€ i์˜ ์ƒˆ์นœ๊ตฌ๋กœ ์ถ”๊ฐ€๋˜๋Š” ์กฐ๊ฑด์€, 1) k๊ฐ€ i ๋ณธ์ธ์ด ์•„๋‹ˆ์–ด์•ผ ํ•˜๊ณ , 2) ์ด๋ฏธ ์นœ๊ตฌ๊ฐ€ ์•„๋‹ˆ์–ด์•ผํ•˜๋ฏ€๋กœ social[i]์— k๊ฐ€ ์—†์–ด์•ผํ•˜๊ณ , 3) ์˜ค๋Š˜ ์ด๋ฏธ ๋‹ค๋ฅธ ๋ฃจํŠธ๋กœ ๋‘˜์ด ์นœ๊ตฌ๊ฐ€ ๋˜์ง€ ์•Š์•˜์–ด์•ผ ํ•œ๋‹ค.

                    if ((i != k) && (social[i].find(k) == social[i].end()) && (m[i].find(k)==m[i].end())){
                        m[i].insert(k);
                        tmp += 1;
                        check += 1;
                    }

 

๋˜ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ถ”์ฒœํ•ด๋ณด์ž๋ฉด..

 

2 1

1 2 ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด

 

0 ์ด ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•˜๊ณ 

 

4 3

1 2

1 3

3 4 ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด

 

2

2

1์ด ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•œ๋‹ค.