1. ๋ฌธ์ ์ค๋ช
2. ์ ๊ทผ ๋ฐฉ์
KEY WORD
: BFS
์๊ฐ ํด์ผํ ์
: ํ๋์ ์ ์ ์ด ์์ ์ ์์น๋ฅผ ์๋ค๋ ๊ฒ์ ๋จ๋ฐฉํฅ ๊ทธ๋ํ์์ ํด๋น ์ ์ง์ด ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๋ค๊ณผ ์์ด๋ฅผ ๊ฐ์ง๋ค๋ ๊ฒ์ด๋ค. ์ด ๋, ํด๋น ์์ด์ ๊ฐ์ ์ ์ผ๋ก ํ์
์ด ๋๋ ๋๋ค.
๊ฐ์ ์ ์ผ๋ก ํ์ ๋๋ค๋ ๊ฒ์ ๋ฌด์จ ๋ป์ธ๊ฐ?
ํด๋น ๊ทธ๋ฆผ์, ๋ฌธ์ ์์ ์์๋ก ์ฃผ์ด์ง, ์ ์ ๋ค๊ฐ์ ๊ด๊ณ์ด๋ค. ๋ฌธ์ ์์๋ 2๋ฒ์ด 1,4,3๋ฒ์๊ฒ ํจํ๊ณ , 5๋ฒ์๊ฒ ์ด๊ฒผ์์ผ๋ก 4๋ฑ์ด๋ผ๊ณ ํ๋ค. 5๋ฒ์ ๊ทธ 2๋ฒ์๊ฒ ์ก์์ผ๋ก, 1,3,4๋ฒ์๊ฒ๋ ๊ฐ์ ์ ์ผ๋ก ์ง ๊ฒ์ด๋ค. ๋ฐ๋ผ์ 2, 5๋ฒ์ ๋ชจ๋ ์ ์ ์ ๋ํด์ ์์ด์ ๊ฐ์ง๋ค.
(1) ๋จ ๋ฐฉํฅ ๊ทธ๋ํ๋ฅผ ๋ ๊ฐ ๋ง๋ค๊ธฐ
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๋จ ๋ฐฉํฅ ๊ทธ๋ํ 2๊ฐ ๋ง๋ค๊ธฐ ์ด๋ค.
์ฐ๋ฆฌ์ ํต์ฌ์, ํ์ฌ ์กฐํ ์ค์ธ ์ ์ ์ด ๊ฐ์ ์ ์ผ๋ก๋ผ๋, ๋ชจ๋ ์ ์ ๊ณผ ์์ด์ ๊ฐ์ง๋๊ฐ?
๋ฅผ ํ์
ํ๋ ๊ฒ์ด๋ค. ํ์ง๋ง, ๋ฌธ์ ์์ ์ฃผ์ด์ง ์
๋ ฅ์ ์นํจ๋ก ์์ด์ด ๊ฐ๋ ค์ง, ๋จ๋ฐฉํฅ ๊ทธ๋ํ์ด๊ธฐ ๋๋ฌธ์, ์์ ์ด ์ก๋ ์ฌ๋์๊ฒ๋ ์ ๊ทผํ ์ ์์ง๋ง, ์์ ์ด ์ด๊ฒผ๋ ์ฌ๋์๊ฒ๋ ์ ๊ทผํ๊ธฐ ํ๋ค๋ค.
๊ทธ๋ ๋ค๊ณ ํด์, ์๋ฐฉํฅ ๊ทธ๋ํ๋ก ์
๋ ฅ ๊ฐ์ ํํํ๋ ์๊ฐ, ์น ํจ ๊ด๊ณ๋ฅผ ์ ์๊ฐ ์์ด์, ๋ต์ ๊ตฌํ ์ ์๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๊ทธ๋ํ๋ฅผ ๋๊ฐ๋ก ๋๋๋ค. ํ๋๋ ์ด๊ธด ์ฌ๋์ ๊ฐ๋ฆฌํค๋ ๊ทธ๋ํ
์ด๊ณ , ๋ค๋ฅธ ํ๋๋ ์ง ์ฌ๋์ ๊ฐ๋ฆฌํค๋ ๊ทธ๋ํ
์ด๋ค.
๋ชจ๋ ์ ์ ์ ๋ํด์ ๋ ๊ฐ์ ๊ทธ๋ํ์ ๋ํด BFS๋ฅผ ์งํํ๋ค. ํ์ฌ ์กฐํ ์ค์ธ ์ ์ ์ A๋ผ๊ณ ํ์. ์ด๋ A์์ ๋ ๊ฐ์ BFS๋ฅผ ํตํด ์ ๊ทผํ ์ ์ ์ ์๊ฐ n-1
(์์ ์ ์ ์ธํ ๋ชจ๋ ์ ์ )์ด๋ฉด, A๋ ๋ชจ๋ ์ ์ ๋ค๊ณผ ์์ด์ ๊ฐ์ง์ผ๋ก, ์์๊ฐ ์๋ค๊ณ ๋ณผ ์ ์๋ค.
์์ ์์์์ 2
๋ ์ผ์ชฝ ๊ทธ๋ํ์์ 3๊ฐ์ ์ ์ ์ ๋ง๋๊ณ , ์ค๋ฅธ์ชฝ ๊ทธ๋ํ์์ 1๊ฐ์ ์ ์ ์ ๋ง๋ ๋๋จธ์ง 4๊ฐ๋ฅผ ๋ชจ๋ ๋ง๋๋ค.5
๋ ์ผ์ชฝ ์ ์ ์์ 4๊ฐ, ์ค๋ฅธ์ชฝ ์ ์ ์์ 0๊ฐ๋ฅผ ๋ง๋, ๋ชจ๋ ์ ์ ๊ณผ ์์ด์ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋์ ์์๋ฅผ ์ ์ ์๋ ์ ์ ์ด 2๊ฐ๊ฐ ๋์ด, ๋ต์ด 2
๊ฐ ๋๋ค.
(2) ์ ์ ๊ฐ์ ๋น๊ต ํ์ ์ธ๊ธฐ
1๋ฒ์ ๋ ผ๋ฆฌ์ ๋ง๋ฟ์ ์๋ค. ์ด๋ค ์ ์ A๊ฐ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊ณผ ์์ด์ ๊ฐ์ง๋ค๋ ์๋ฆฌ๋, ์ ์ ๊ฐ์ ์นํจ ๋น๊ตํ์๊ฐ n-1์ด๋ผ๋ ์๋ฆฌ์ด๋ค.
1.์์ ์์์ ๋์๋ ๊ทธ๋ํ ์ค ์ผ์ชฝ ๊ทธ๋ํ๋ง ์ฌ์ฉํ๋ค.
2. ๊ฐ ์ ์ ์ ๋น๊ต ํ์๋ฅผ ์ธ๋ ๋ฐฐ์ด (compareCnt)๋ฅผ ๋ง๋ ๋ค. ํด๋น ๋ฐฐ์ด์ ์ ์ ๊ฐ์ ๋น๊ต๋ฅผ ํ๋ฉด, ๋น๊ต๋ ์ ์ ๋ ๊ฐ์ ์นด์ดํธ๋ฅผ ์ฌ๋ ค์ค๋ค. ์๋ฅผ ๋ค์ด 5๋ฒ์์ BFS๋ฅผ ๋๋ฉด 5๋ฒ์ 3๋ฒ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฌ๋ฉด, compareCnt[5]์ compareCnt[3]์ ๋ชจ๋ +1์ฉ ์ฌ๋ ค์ค๋ค.
์์ ๊ทธ๋ํ์์ ๊ฐ ์ ์ ๋ง๋ค BFS๋ฅผ ๋๋ฉฐ, ๋น๊ต ํ์๋ฅผ ์ธ๋ ๋ฐฐ์ด์ ๊ณ์ฐํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
3.์์ ์ ์ ์ธํ ๋ชจ๋ ์ ์ ๊ณผ ๋น๊ตํ๋ฉด, n-1๋ฒ์ ๋น๊ต๋ฅผ ํด์ผํ๋ค. ๋ฐ๋ผ์ ํด๋น ๋ฌธ์ ์ ๋ต์ ์ ์ 2
์ ์ ์ 5
๊ฐ ๋์ค๋ฏ๋ก ๋ต์ 2 ์ด๋ค.
3. ์ฝ๋ ๋ถ์
(1)์ ๊ตฌํ ์ฝ๋
import java.io.*;
import java.util.*;
class Solution {
static int N;
static ArrayList<Integer> [] lose;
static ArrayList<Integer> [] win;
static int ans = 0;
public int solution(int n, int[][] results) {
N = n;
lose = new ArrayList [n+1];
win = new ArrayList [n+1];
for(int i = 1; i <= n; i ++){
lose[i] = new ArrayList<>();
win[i] = new ArrayList<>();
}
for(int i = 0; i < results.length; i++){
int winner = results[i][0];
int loser = results[i][1];
lose[loser].add(winner);
win[winner].add(loser);
}
for(int i = 1; i<= n; i++){
int cnt = 0;
cnt += bfs(true, i);
cnt += bfs(false, i);
if (cnt == n-1) ans++;
}
return ans;
}
public int bfs(boolean isWinner, int now) {
ArrayList<Integer> [] list = isWinner? win : lose; // ํ์ฌ ์ฌ์ฉ ์ค์ธ ๊ทธ๋ํ
ArrayDeque<Integer> aq1 = new ArrayDeque<>(); // BFS ์ฉ queue
boolean [] isVisited = new boolean[N+1]; // ๋ฐฉ๋ฌธ ๋ฐฐ์ด
int cnt = 0; // ์นํจ๊ฐ ํ์ธ๋ ๊ฐ์
aq1.add(now);
isVisited[now] = true;
while(!aq1.isEmpty()){
int cur = aq1.poll();
for(int i = 0; i<list[cur].size(); i ++) {
int next = list[cur].get(i);
if(!isVisited[next]){
isVisited[next] = true;
cnt++;
aq1.add(next);
}
}
}
return cnt;
}
}
(2)์ ๊ตฌํ ์ฝ๋
import java.io.*;
import java.util.*;
/* ๋ฌธ์ ์ค๋ช
* ์์๋ฅผ ๋น๊ตํจ
* ์นํจ๋ฅผ 1๋1 ๋น๊ตํ๋๋ฐ, 1:N์ผ๋ก ์ ๋ถ ๋ค ํ ๊ฒ ์๋. ์๋ฅผ ๋ค์ด A,B,C,D๊ฐ ์์ผ๋ฉด A,B ์นํจ ๋น๊ต, BC๋น๊ต CD๋น๊ตํ์ผ๋ฉด A๋ C๋ B์ ๋น๊ต๋ฅผ ์ํ๊ฒ์
* ๋ฐ๋ผ์ ๋๊ตฌ๋ ์นํจ ๋น๊ตํ๋ ๊ฑฐ ๋ณด๊ณ ์๊ธฐ๊ฐ ๋ช ๋ฒ์งธ ์์์ธ์ง ์๋๋ฐ, ๋๊ตฌ๋ ๋ชจ๋ฅธ๋ค.
* ์๊ธฐ๊ฐ ๋ช ๋ฒ์งธ ์์์ธ์ง ์๋ ๋ณต์์ ์๋ฅผ ๊ตฌํ๋ผ
* */
/* ๋ฌธ์ ํ์ด */
// 1. ๋จ๋ฐฉํฅ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฐ๋ค.
// 2. ๋ชจ๋ ์ ์ ์์ ์ถ๋ฐํ์ฌ bfs๋ฅผ ๋๋ฆฐ๋ค.
// 3. ์ ์ ๋น๊ต ํ์ ๋ฐฐ์ด์ ๋ง๋ค๊ณ , bfs๋ฅผ ๋๋ ค์ ํน์ ์ ์ ์ ๋ฐฉ๋ฌธํ์ ๊ฒฝ์ฐ, ์ถ๋ฐ ์ ์ ๊ณผ ๋น๊ต ์ ์ ์ cnt+1์ฉ ์ฌ๋ฆฐ๋ค.
// bfs๋ฅผ ํ๊ณ ๋๋ฌํ ์ ์๋ ์ ์ ์, ์ธ์ ํ์ง ์์๋ ์๋ก ๊ฐ์ ์ ์ผ๋ก ๋น๊ต๊ฐ ๋๋ค๋ ์๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
// 4. ๋ชจ๋ ์ ์ ์ ๋ํ bfs๋ฅผ ๋ง์น๊ณ , ์ ์ A์ ๋ฐฉ๋ฌธ ํ์๊ฐ ์ ์ ์ ๊ฐฏ์์ ์ผ์นํ๋ฉด, ํด๋น ์ ์ ์ ์์ ์ ์์๋ฅผ ์๋ ๋
์์ด๋ค. ์ด ์๋ฅผ ์ผ๋ค.
class Solution {
static int N;
static ArrayList<Integer> [] graph;
static int [] compareCnt;
static int ans = 0;
public int solution(int n, int[][] results) {
N = n;
graph = new ArrayList [n+1];
compareCnt = new int [n+1];
for(int i = 1; i <= n; i ++){
graph[i] = new ArrayList<>();
}
for(int i = 0; i < results.length; i++){
int winner = results[i][0];
int loser = results[i][1];
graph[loser].add(winner);
}
for(int i = 1; i <= n; i++){
bfs(i);
}
for(int i = 1; i <= n; i++){
if(compareCnt[i] == n-1) ans++;
}
return ans;
}
public void bfs(int now) {
ArrayDeque<Integer> aq1 = new ArrayDeque<>();
boolean [] isVisited = new boolean[N+1];
isVisited[now] = true;
aq1.add(now);
while(!aq1.isEmpty()){
int cur = aq1.poll();
for(int i = 0; i < graph[cur].size(); i++){
int next = graph[cur].get(i);
if(!isVisited[next]){
isVisited[next] = true;
aq1.add(next);
compareCnt[now]++;
compareCnt[next]++;
}
}
}
}
}
4. ์ฑ์ฅ ํ๊ธฐ
๊ฐ ๋ต๋ณ์ ์๊ฐ ์๋๋ฅผ ๋น๊ตํด๋ณด๊ฒ ๋ค.
(1)๋ฒ์ ๊ฐ TC ๋ณ ์๋
(2)๋ฒ์ ๊ฐ TC๋ณ ์๋
2๋ฒ์ด BFS๋ฅผ ํ ๋ฒ๋ง ๋๋ฉด ๋์ด์ ๋์ฒด์ ์ผ๋ก ์กฐ๊ธ ๋ ๋น ๋ฅธ ๋ฏ ํ๋ค.