๋ฌธ์ ๋งํฌ
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 |
'ํ๋ก๊ทธ๋๋จธ์ค > 3๋จ๊ณ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ์ฌ ์ฐ๊ฒฐํ๊ธฐ (0) | 2022.06.23 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ์ ๊ตญ์ฌ์ฌ (0) | 2022.06.21 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ์ฌํ๊ฒฝ๋ก (0) | 2022.06.20 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ๋จ์ด ๋ณํ (1) | 2022.06.20 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ๋คํธ์ํฌ (0) | 2022.06.20 |