๋ฌธ์
https://www.acmicpc.net/problem/9466
๋ด ๋ฌธ์ ํ์ด
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] stu;
static boolean[] cycle, visited;
static int cnt; // ์ธ์ดํด์ ํฌํจ๋ ํ์ ์
public static void dfs(int num) {
if(visited[num]) { // ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ (์ธ์ดํด !!!)
cycle[num] = true;
cnt++;
} else visited[num] = true; // ์ฒซ ๋ฐฉ๋ฌธ์ ๋ฐฉ๋ฌธ ์ฒดํฌ
if(!cycle[stu[num]]) dfs(stu[num]); // ๋ค์ ๋
ธ๋๊ฐ ์ฌ์ดํด์ ํฌํจ๋์ง ์์๋ค๋ฉด ํ์
cycle[num] = true; // ๋ค์ ํ์ ์ ์ค๋ณต์ ํผํ๊ธฐ ์ํจ
}
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder out = new StringBuilder();
int tc = Integer.parseInt(in.readLine());
for(int t = 0; t < tc; t++) {
int n = Integer.parseInt(in.readLine());
stu = new int[n];
visited = new boolean[n];
cycle = new boolean[n];
cnt = 0;
st = new StringTokenizer(in.readLine());
for(int i = 0; i < n; i++) stu[i] = Integer.parseInt(st.nextToken()) - 1;
for(int i = 0; i < n; i++) if(!cycle[i]) dfs(i); // ์ธ์ดํด์ ํฌํจ๋์ง ์์ ์๋ฉด ํ์
out.append((n - cnt) + "\n"); // ์ ์ฒด ํ์ ์ - ์ฌ์ดํด์ ํฌํจ๋ ํ์ ์
}
System.out.println(out);
}
}
๐ DFS ๋ฌธ์
[ ๋ณ์ ์ค๋ช ]
- boolean[] visited
๋ฐฉ๋ฌธ ์ฒดํฌ (๋ ๋ฒ์งธ ๋ฐฉ๋ฌธ ์ ์ธ์ดํด์์ ํ๋จํ๊ธฐ ์ํจ) - boolean[] cycle
์ธ์ดํด ์ฒดํฌ (์ธ์ดํด์ ํฌํจ๋ ํ์๋ค์ ์ฒดํฌํด๋์์ผ๋ก์จ ์ค๋ณต ํ์์ ํผํ๊ธฐ ์ํจ) - cnt
์ธ์ดํด์ ํฌํจ๋ ํ์ ์ ์นด์ดํธ
[ ๋ฌธ์ ํ์ด ]
- ํ์ฌ ํ์ํ๋ ์ num์ด visited์์ true์ผ ๊ฒฝ์ฐ, ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ ์๋ค๋ ๊ฒ์ด๊ณ ,
์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ ๋ ๋ฐฉ๋ฌธํ๊ฒ ๋์๋ค๋ ๊ฒ์ ์ธ์ดํด์ด ์ด๋ฃจ์ด์ก๋ค๋ ์๋ฏธ !!
=> cycle์ true๋ก ํ์ํด์ฃผ๊ณ , cnt๋ฅผ ๋๋ ธ๋ค. - ํ์ฌ ๋
ธ๋๊ฐ ๊ฐ๋ฆฌํค๋ ๋ค์ ๋
ธ๋ stu[num]์ cycle์ด false๋ผ๋ฉด
์์ง ์ธ์ดํด์ ์ฐพ์ง ๋ชปํ ๋ ธ๋๋ผ๋ ์๋ฏธ์ด๋ฏ๋ก, ์ด์ด์ ํ์ํ ์ ์๋๋ก ์ฌ๊ทํธ์ถํ๋ค. - ํ์ฌ ๋
ธ๋์ cycle์ true๋ก ๋ฐ๊ฟ์ฃผ์ด ์ถํ ๊ฐ์ ๊ณณ์ ์ค๋ณตํ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
- ์ฒ์์ ์ด ๋ถ๋ถ ๋๋ฌธ์ ๊ตฌํ์ด ์ด๋ ค์ ๋๋ฐ, ์ถ๊ฐ๋ก ์ค๋ช
ํด๋ณด์๋ฉด
๋ณดํต์ ๊ทธ๋ํ ๋ฌธ์ ์์๋ ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ์ํด visited ๋ฐฐ์ด ํ๋๋ง ์ฌ์ฉํ๋ค. - ํ์ง๋ง ์ด ๋ฌธ์ ์ ๊ฒฝ์ฐ, ๋ ๋ฒ ๋ฐฉ๋ฌธํ์ ๋๊ฐ ์ธ์ดํด์ ์ด๋ฃจ๋ ๊ฒ์ด๋ฏ๋ก
ํ ๋ฒ ๋ฐฉ๋ฌธํ ๊ฒ์ ์ฒดํฌํ๋ ๊ฒ์ ์ง์ง ๋ฐฉ๋ฌธ์ฒดํฌ๋ผ๊ณ ๋ณผ ์ ์๋ ๊ฒ์ด๋ค.
=> visited ๋ฐฐ์ด ํ๋๋ง์ผ๋ก๋ ๋ฐฉ๋ฌธ ์ฒดํฌ์ ํ๊ณ๊ฐ ์์
- ์ฒ์์ ์ด ๋ถ๋ถ ๋๋ฌธ์ ๊ตฌํ์ด ์ด๋ ค์ ๋๋ฐ, ์ถ๊ฐ๋ก ์ค๋ช
ํด๋ณด์๋ฉด
โ๏ธ ๋ฐ๋ก ์ถ์ฒ
1
3
2 3 2
๐ก ํผ๋๋ฐฑ
- ์ด๋ ต๋ค...... bfs๋ ๊ฝค ์ต์ํ๊ฒ ํผ๋ค๊ณ ์๊ฐํ๋๋ฐ! dfs๋ ์ง์ง ๋๋ฌด ์ด๋ ค์....
์ด๊ฑฐ ์ฌ๊ท๋ฅผ ์ ๋ชปํด์ ๊ทธ๋ฐ๊ฑด๊ฐ? ใ ใ ์ฌ๊ท ๋ฌธ์ ๋ ๋ง์ด ํ์ด๋ด์ผ๊ฒ ๋ค. - ์ด ๋ฌธ์ ๋ ์์ธ๋ ๊ฝค ์๊ณ , ์๊ฐ ์ด๊ณผ๋ฅผ ์ ๊ณ ๋ คํด์ค์ผ ํ๋ ๋ฌธ์ .!!
์ด๋ฐ ์์ผ๋ก dfs๋ ์ธ์ดํด์ ์ฐพ๋ ๋ฌธ์ ๊ฐ ๋ง์๋ฏํ๋ฐ ์ฐ์ต์ด ํ์ํ๊ฒ ๋ค..
'2๏ธโฃ Java > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java Algorithm] ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ 4 BOJ #17406 (0) | 2022.08.10 |
---|---|
[Java Algorithm] ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ 2 BOJ #16927 (0) | 2022.08.10 |
[Java Algorithm] ํธ๋ฆฌ BOJ #4803 (0) | 2022.08.09 |
[Java Algorithm] ์จ๋ฐ๊ผญ์ง 4 BOJ #13913 (0) | 2022.08.08 |
[Java Algorithm] ๋ถ BOJ #5427 (0) | 2022.08.08 |
๋๊ธ