๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/3๋‹จ๊ณ„

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv3] : ์ˆœ์œ„

by Jaeguk 2022. 6. 20.
๋ฌธ์ œ ๋งํฌ

https://programmers.co.kr/learn/courses/30/lessons/49191

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์ˆœ์œ„

5 [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] 2

programmers.co.kr

๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ์˜ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ์ผ๋ถ€๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ˆœ์œ„๋ฅผ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ๋Š” ์„ ์ˆ˜์˜ ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋ฌธ์ œ.

 

ํ’€์ด

๋งŒ์•ฝ ๊ฒฝ๊ธฐ ์ „์ฒด์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๋ฉด ๋ชจ์ˆœ์ด ์—†๋‹ค๋Š” ์ „์ œ ํ•˜์— ์œ„์ƒ์ •๋ ฌ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฒฝ์ง€ ์ „์ฒด์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹Œ ์ผ๋ถ€๋งŒ ์ฃผ์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์œ„์ƒ์ •๋ ฌ์„ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์—†์—ˆ๋‹ค.

 

  • ํ’€์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ˆœ์œ„๋ฅผ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ๋Š” ์„ ์ˆ˜๋Š” ์–ด๋–ค ์„ ์ˆ˜๋“ค์ธ๊ฐ€?

์ž์‹ ์„ ์ œ์™ธํ•œ n-1๋ช…๊ณผ์˜ ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ๊ฐ€ ๋ชจ๋‘ ๋“œ๋Ÿฌ๋‚œ ์„ ์ˆ˜๋Š” ์ˆœ์œ„๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ฃผ์–ด์ง„ ๊ฒฝ๊ธฐ๊ฒฐ๊ณผ์—” ์ œํ•œ์ด ์žˆ๊ธฐ๋•Œ๋ฌธ์— ์ฃผ์–ด์ง„ ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฒฝ๊ธฐ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•ด์•ผํ•œ๋‹ค.

๊ฒฐ๊ณผ๋Š” 100% ์‹ค๋ ฅ์— ์˜ํ•ด์„œ ๊ฒฐ์ •๋˜๋ฏ€๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์„ ์ˆ˜ A์™€ B๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

์ด๋•Œ ์„ ์ˆ˜ A๊ฐ€ B๋ฅผ ์ด๊ฒผ๋‹ค๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค. ๊ทธ๋Ÿผ ์ด ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด์„œ ์šฐ๋ฆฌ๋Š” 2๊ฐ€์ง€ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

1. B๊ฐ€ ์ด๊ธฐ๋Š” ์„ ์ˆ˜๋Š” A๋„ ์ด๊ธด๋‹ค.

2. A๊ฐ€ ๋ชป์ด๊ธฐ๋Š” ์„ ์ˆ˜๋Š” B๋„ ๋ชป์ด๊ธด๋‹ค.

 

์ด ๊ณผ์ •์„ ํ†ตํ•ด์„œ ์šฐ๋ฆฌ๋Š” ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ์ฑ„์›Œ๋‚˜๊ฐ„๋‹ค.

๋งˆ์ง€๋ง‰๊นŒ์ง€ ๋ณธ์ธ์„ ์ œ์™ธํ•œ n-1๋ช…๊ณผ์˜ ๊ฒฐ๊ณผ๋ฅผ ์•Œ์ง€๋ชปํ•˜๋Š” ์„ ์ˆ˜๋Š” ์ˆœ์œ„๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ์„ ์ˆ˜๋‹ค.

 

  • ํ•„์š”ํ•œ ์ž๋ฃŒ๋“ค

1. ์ž„์˜์˜ ์„ ์ˆ˜ i ์— ๋Œ€ํ•ด i๊ฐ€ ์ด๊ธธ ์ˆ˜ ์žˆ๋Š” ์„ ์ˆ˜๋“ค์˜ ๋ช…๋‹จ & i๊ฐ€ ๋ชป์ด๊ธฐ๋Š” ์„ ์ˆ˜๋“ค์˜ ๋ช…๋‹จ

์ด ๋ช…๋‹จ์€ ์ดˆ๊ธฐ์— ์ฃผ์–ด์ง„ ๊ฒฐ๊ณผ๋“ค๋กœ ์ฑ„์šธ ์ˆ˜ ์žˆ๊ณ , ์ดํ›„ ์ถ”๋ก ํ•œ ์ •๋ณด๋กœ๋„ ์ฑ„์šธ ์ˆ˜ ์žˆ๋‹ค.

i๊ฐ€ ์ด๊ธธ ์ˆ˜ ์žˆ๋Š” ์„ ์ˆ˜๋“ค์˜ ์ˆ˜ + ๋ชป์ด๊ธฐ๋Š” ์„ ์ˆ˜๋“ค์˜ ์ˆ˜ ๊ฐ€ n-1์ด ๋  ๋•Œ ์„ ์ˆ˜ i ์˜ ์ˆœ์œ„๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ ์„ ์ˆ˜๋“ค์˜ ๋ช…๋‹จ์€ ์ค‘๋ณต์ด ๋˜๋ฉด ์•ˆ๋˜๋ฏ€๋กœ set์„ ์ด์šฉํ•ด์„œ ์ค‘๋ณต์„ ์•Œ์•„์„œ ๋ฐฉ์ง€ํ•˜๊ฒŒ๋” ํ–ˆ๋‹ค.

set<int> Can_Win[ i ] ์—๋Š” i ์„ ์ˆ˜๊ฐ€ ์ด๊ธธ ์ˆ˜ ์žˆ๋Š” ์„ ์ˆ˜๋“ค์˜ ๋ช…๋‹จ์„

set<int> Cant_Win[ i ] ์—๋Š” i ์„ ์ˆ˜๊ฐ€ ์ด๊ธฐ์ง€ ๋ชปํ•˜๋Š” ์„ ์ˆ˜๋“ค์˜ ๋ช…๋‹จ์„ ์ €์žฅํ–ˆ๋‹ค.

 

 2. ์„ ์ˆ˜ i๊ฐ€ ์„ ์ˆ˜ j๋ฅผ ์ด๊ธฐ๋Š” ์ง€ ์—ฌ๋ถ€

๋‘ ์„ ์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ˆ„๊ฐ€ ์ด๊ธฐ๋Š” ์ง€๋ฅผ ๋งค๋ฒˆ ์ฃผ์–ด์ง„ ๋ฒกํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์ฐพ๋Š”๋‹ค๋ฉด ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค.

Result๋ผ๋Š” 2์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ Result[ i ][ j ] == true๋ฉด i๊ฐ€ j๋ฅผ ์ด๊ธฐ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จ.

๋ฐ˜๋Œ€๋กœ Result[ j ][ i ] == true๋ฉด j๊ฐ€ i๋ฅผ ์ด๊ธด๋‹ค๊ณ  ํŒ๋‹จ.

 

3. ์ด๋ฏธ ์ˆœ์œ„๊ฐ€ ํ™•์ •๋œ ์„ ์ˆ˜ ์ธ์ง€ ์ฒดํฌ

visited ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ์„ ์ˆ˜ i ๊ฐ€ ์ด๋ฏธ ์ˆœ์œ„๊ฐ€ ํ™•์ •๋œ ์„ ์ˆ˜์ธ์ง€ ์ฒดํฌํ–ˆ๋‹ค.

๋งŒ์•ฝ ์ด๋ฏธ ํ™•์ •๋œ ์„ ์ˆ˜๋ผ๋ฉด ๊ตณ์ด i์— ๋Œ€ํ•ด ์กฐ์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

์ฝ”๋“œ ์ž‘์„ฑ
 
#include <string>
#include <vector>
#include <set>
#include <queue>
using namespace std;
const int MAX_N = 100 + 5;
bool Result[MAX_N][MAX_N];
bool visited[MAX_N];
set<int> Can_Win[MAX_N];
set<int> Cant_Win[MAX_N];
vector<int> Edge[MAX_N];
 
int solution(int n, vector<vector<int>> results) {
    int answer = 0;
    for(int i = 0; i<results.size(); i++){
        int winner = results[i][0];
        int loser = results[i][1];
        Edge[winner].push_back(loser);
        Edge[loser].push_back(winner);
        Result[winner][loser] = true;
        Can_Win[winner].insert(loser);
        Cant_Win[loser].insert(winner);
    }
    
    for(int i = 1; i<=n; i++){
        for(int j = 0; j<Edge[i].size(); j++){
            int rival = Edge[i][j];
            if(Result[i][rival]){
                //i๊ฐ€ rival์„ ์ด๊น€
                // i๊ฐ€ ์ด๊ธธ ์ˆ˜ ์—†๋Š” ์ƒ๋Œ€๋Š” rival๋„ ๋ชป์ด๊น€
                // rival์ด ์ด๊ธฐ๋Š” ์ƒ๋Œ€๋Š” i๋„ ์ด๊น€
                for(auto it : Cant_Win[i])
                    Cant_Win[rival].insert(it);
                for(auto it : Can_Win[rival])
                    Can_Win[i].insert(it);
            }
            else if(Result[rival][i]){
                //rival์ด ์ด๊น€
                //rival์ด ์ด๊ธธ ์ˆ˜ ์—†๋Š” ์ƒ๋Œ€๋Š” i๋„ ๋ชป์ด๊น€
                // i๊ฐ€ ์ด๊ธฐ๋‹Œ ์ƒ๋Œ€๋Š” rival๋„ ์ด๊น€
                for(auto it : Can_Win[i])
                    Can_Win[rival].insert(it);
                for(auto it : Cant_Win[rival])
                    Cant_Win[i].insert(it);
            }
        }
    }

    queue<int> q;
    for(int i = 1; i<=n; i++){
        if(Can_Win[i].size() + Cant_Win[i].size() == n - 1//์ˆœ์œ„๊ฐ€ ๊ฒฐ์ •๋œ ์„ ์ˆ˜
            q.push(i);
    }
    
    while(!q.empty()){
        int now = q.front();
        q.pop();
        if(visited[now]) //์ด๋ฏธ ๊ฒฐ์ •๋‚œ ์„ ์ˆ˜๋ฉด ํŒจ์Šค
            continue;
        answer++;
        visited[now] = true;
        for(int i = 0; i<Edge[now].size(); i++){
            int rival = Edge[now][i];
            if(Result[now][rival]){ //๋‚ด๊ฐ€ ์ด๊น€
                //๋‚˜๋ฅผ ์ด๊ธฐ๋Š” ์‚ฌ๋žŒ์€ ์ƒ๋Œ€๋„ ์ด๊น€
                for(auto it : Cant_Win[now])
                    Cant_Win[rival].insert(it);
            }
            else if(Result[rival][now]){ //์ƒ๋Œ€๊ฐ€ ์ด๊น€
                //๋‚ด๊ฐ€ ์ด๊ธด์‚ฌ๋žŒ์€ ์ƒ๋Œ€๋„ ์ด๊น€
                for(auto it : Can_Win[now])
                   Can_Win[rival].insert(it);
            }
            if(Can_Win[rival].size() + Cant_Win[rival].size() == n-1 && !visited[rival])
                q.push(rival);
        }
    }
    return answer;
}
cs

 

728x90