https://www.acmicpc.net/problem/10159
๋ฌธ์
- ๋ฌผ๊ฑด์ ๊ฐ์ N ๊ณผ ์ผ๋ถ ๋ฌผ๊ฑด ์์ ๋น๊ต ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ ๋ฌผ๊ฑด์ ๋ํด์ ๊ทธ ๋ฌผ๊ฑด๊ณผ์ ๋น๊ต ๊ฒฐ๊ณผ๋ฅผ ์ ์ ์๋ ๋ฌผ๊ฑด์ ๊ฐ์๋ฅผ ์ถ๋ ฅ
- ์๋ฅผ ๋ค์ด, ์ด 6๊ฐ์ ๋ฌผ๊ฑด์ด ์๊ณ , ๋ค์ 5๊ฐ์ ๋น๊ต ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ก๋ค๊ณ ๊ฐ์ ํ์. ([1]์ 1๋ฒ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๋ฅผ ์๋ฏธํ๋ค.)
- [1]>[2], [2]>[3], [3]>[4], [5]>[4], [6]>[5]
- ์ฐ๋ฆฌ๋ [2]>[3], [3]>[4]๋ก๋ถํฐ [2]>[4]๋ผ๋ ๊ฒ์ ์ ์ ์๋ค. ํ์ง๋ง, ๋ฌผ๊ฑด 2์ ๋ฌผ๊ฑด 6์ ๋น๊ตํ๋ ๊ฒฝ์ฐ, ์์์ ๊ฒฐ๊ณผ๋ง์ผ๋ก๋ ์ด๋ ๊ฒ์ด ๋ฌด๊ฑฐ์ด์ง ์ ์ ์๋ค. ์ด์ ๊ฐ์ด, ๋ฌผ๊ฑด 2๋ ๋ฌผ๊ฑด 1, 3, 4์์ ๋น๊ต ๊ฒฐ๊ณผ๋ ์ ์ ์์ง๋ง, ๋ฌผ๊ฑด 5, 6๊ณผ์ ๋น๊ต ๊ฒฐ๊ณผ๋ ์ ์ ์๋ค. ๋ฌผ๊ฑด 4๋ ๋ชจ๋ ๋ค๋ฅธ ๋ฌผ๊ฑด๊ณผ์ ๋น๊ต ๊ฒฐ๊ณผ๋ฅผ ์ ์ ์๋ค.
ํ์ด
์ด๋ ํ ๋ ๊ฐ์ ์์๋ฅผ ๋น๊ตํด ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋ชจ๋ ์์ ๊ฐ์ ์์ ๊ด๊ณ๋ฅผ ์์๋ด์ผ ํ๋ ๋ฌธ์ ๋ก ์ด์ ์ ํ๋ก๊ทธ๋๋จธ์ค์์ ํ์๋ '์์'์ ๋น์ทํ ์ ํ์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ๋์ ํ์ด๋ฒ์ ๋ฐ๋ก ๋ ์ฌ๋ฆด ์ ์์๋ค.
https://school.programmers.co.kr/learn/courses/30/lessons/49191
- ๊ทธ๋ํ์ ์๋ฃ๊ตฌ์กฐ : ์ฐ๊ฒฐ ๋ฆฌ์คํธ
A > B์ ์์ ๊ด๊ณ๊ฐ ์ฃผ์ด์ง๊ณ , ์ด์ด์ B > C๊ฐ ์ฃผ์ด์ง๋ฉด A > B > C๋ก ๊ด๊ณ๊ฐ ์ฐ๊ฒฐ๋๋ฏ๋ก ์ด๋ฅผ ํํํ๊ธฐ์๋ 2์ฐจ์ ๋ฐฐ์ด์ ๊ทธ๋ํ๋ณด๋ค๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ์ ํฉํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ ฅ์ด 5 ≤ N ≤ 100์ด๊ณ , 0 ≤ M ≤ 2,000์ด๋ฏ๋ก ๊ณต๊ฐ๋ณต์ก๋ ์ธก๋ฉด์์๋ ํจ์จ์ ์ด๋ค. 2์ฐจ์ ๋ฐฐ์ด์ ๊ทธ๋ํ๋ก ํํํ๋ค๋ฉด 100 * 100 = 10,000์ผ๋ก ๋น๊ต ๊ฒฐ๊ณผ(M)์ ์ต๋์น์ธ 2,000์ ํจ์ฌ ๋๋๋ค.
- ๊ทธ๋ํ ํ์ : BFS
๋ฌผ๊ฑด๊ณผ์ ๋น๊ต ๊ฒฐ๊ณผ๋ฅผ ์ ์ ์๋ ๋ฌผ๊ฑด์ ๊ฐ์๋ฅผ ์๊ธฐ ์ํด์๋ ๋ฐ๋๋ก ๋ฌผ๊ฑด๊ณผ์ ๋น๊ต ๊ฒฐ๊ณผ๋ฅผ ์ ์ ์๋ ๋ฌผ๊ฑด์ ๊ฐ์๋ฅผ ์์๋ด์ผ ํ๋ค. ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ A > B๋ก ๋น๊ตํ ์ ์๋ ๋ฌผ๊ฑด ๊ฐ์ ๊ด๊ณ๊ฐ ์ ์ฅ๋์ด ์์ผ๋ฏ๋ก, ํด๋น ๋ฌผ๊ฑด์ ์์์ ์ผ๋ก ๊ทธ๋ํ ํ์์ ํ๋ค๋ฉด ์์ ๋ณด๋ค ๊ฐ๋ฒผ์ด ๋ฌผ๊ฑด๋ค์ ๋ฒํธ๋ฅผ ์ ์ ์๋ค.
BFS(๋๋น์ฐ์ ํ์)์ ํตํด ํ์ ๋ด๊ฒจ ํ์ํ๊ฒ ๋๋ ์์๋ค์ ๊ฐ์๋ฅผ ์นด์ดํธํด ์ข ๋ฃ๋ ๋ ๊ฐ์๋ฅผ ๋ฐํํ๋๋ก ํ๋ค.
- ์๋ฐฉํฅ์ ๊ด๊ณ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ ๊ฐ์ ๊ทธ๋ํ
์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ํ๋๋ก ๋์ด A > B์ ๊ด๊ณ๋ง ์ ์ฅ์ ํ๊ฒ ๋๋ค๋ฉด, ์์ ๋ณด๋ค ๊ฐ๋ฒผ์ด ์์๋ค๋ง ์ ์ ์์ ๋ฟ, ๋ฌด๊ฑฐ์ด ์์๋ค์ ์์ง ๋ชปํ๊ฒ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๊ณ ํ๋์ ๊ทธ๋ํ์ ์๋ฐฉํฅ์ผ๋ก ์ ์ฅํ๊ฒ ๋๋ค๋ฉด A > B, A > C์ธ ๊ฒฝ์ฐ, B๋ฅผ ์์์ผ๋ก ํ์ํ๊ฒ ๋๋ค๋ฉด ๊ด๊ณ๋ฅผ ์ ์ ์๋ C๋ ํ์์ ํด ์์๋ฅผ ์ ์ ์๊ฒ ๋์ด๋ฒ๋ฆฐ๋ค.
๊ทธ๋์ ์์ ๋ณด๋ค ๋ฌด๊ฑฐ์ด ์์๋ค๋ง ํ์ํ๋๋ก ํ๊ณ ์ถ๋ค๋ฉด, ๋ฐ๋์ ๊ด๊ณ์ธ B < A๋ฅผ ์ ์ฅํ๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ํ๋ ๋ ๋ง๋ค๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ํด์๋ ํด๋น ๋ฌผ๊ฑด์ ์์์ ์ผ๋ก ๊ทธ๋ํ ํ์์ ํ์ฌ ํ์ํ๊ฒ ๋๋ ์์๋ค์ ๊ฐ์๋ฅผ ์นด์ดํธํ๊ณ , ๋ค๋ฅธ ๋ฆฌ์คํธ์ ๊ฒฐ๊ณผ์ ๋ํ๋ฉด ๋๋ค.
์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static ArrayList<Integer>[] graph1; //์ธ์ ๋ฆฌ์คํธ: ๊ด๊ณ ์ ์ฅ(A > B)
static ArrayList<Integer>[] graph2; //๋ฐ๋๋ก ์ ์ฅ(B < A)
static boolean[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
graph1 = new ArrayList[N + 1];
for(int i = 1; i < N + 1; i++) {
graph1[i] = new ArrayList<>();
}
graph2 = new ArrayList[N + 1];
for(int i = 1; i < N + 1; i++) {
graph2[i] = new ArrayList<>();
}
for(int i = 0; i < M; i++) { //๋ฌผ๊ฑด ๋น๊ต ์ ๋ณด ์ ์ฅ
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
graph1[a].add(b); //A > B
graph2[b].add(a); //B < A
}
//๊ตฌํ
int[] answer = new int[N + 1];
for(int i = 1; i < N + 1; i++) {
visited = new boolean[N + 1];
int sum = bfs(graph1, i); //i๋ณด๋ค ์์ ๋ฌผ๊ฑด ๊ฐ์(iํฌํจ)
visited = new boolean[N + 1];
sum += bfs(graph2, i); //i๋ณด๋ค ํฐ ๋ฌผ๊ฑด ๊ฐ์(iํฌํจ)
answer[i] = N - sum - 1; //๋น๊ต ๊ฒฐ๊ณผ๋ฅผ ์ ์ ์๋ ๋ฌผ๊ฑด์ ๊ฐ์
}
//์ถ๋ ฅ
StringBuilder sb = new StringBuilder();
for(int i = 1; i < N + 1; i++) {
sb.append(answer[i] + "\n");
}
System.out.println(sb);
}
public static int bfs(ArrayList<Integer>[] graph, int v) {
Queue<Integer> queue = new LinkedList<>();
queue.add(v);
visited[v] = true;
int count = 0; //๋น๊ต ๊ฐ๋ฅ ๋ฌผ๊ฑด ๊ฐ์
while(!queue.isEmpty()) {
int p = queue.poll();
for(int i : graph[p]) {
if(!visited[i]) {
queue.add(i);
visited[i] = true;
count++;
}
}
}
return count;
}
}
๊ฒฐ๊ณผ
๋ฐฐ์ด์