๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/9455
๐ ๋ฌธ์ ์์ฝ
- ๊ฐ ํ์๋ค์ ํ๋ก์ ํธ ํ์ ๊ตฌ์ฑํ ๋,์์ ์ด ์ํ๋ ๋จ ํ ๋ช ์ ํ์๋ง ์ ํํ ์ ์๋ค.
- ํ์ ์ด๋ฃจ๋ ๊ฒฝ์ฐ๋ ์ฌ์ดํด(Cycle)์ด ํ์ฑ๋ ๊ฒฝ์ฐ์ด๋ค.
- ํ์ ์ด๋ฃจ์ง ๋ชปํ ํ์์ ์๋ฅผ ์ถ๋ ฅํด์ผ ํ๋ค.
๐ ํ์ด ๋ฐ ์๊ณ ๋ฆฌ์ฆ
1๏ธโฃ DFS๋ฅผ ํ์ฉํ ์ฌ์ดํด ํ์
- ๊ฐ ํ์์ด ๊ฐ๋ฆฌํค๋ ๊ด๊ณ๋ฅผ DFS๋ฅผ ํตํด ๋ฐ๋ผ๊ฐ๋ฉด์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌ
- DFS ํ์ ์ค ๋ฐฉ๋ฌธํ๋ ๋ ธ๋๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ๋ฉด ์ฌ์ดํด์ด ํ์ฑ๋ ๊ฒ
2๏ธโฃ ๋ฐฉ๋ฌธ ์ฒดํฌ(visited)์ ์ข ๋ฃ ์ฒดํฌ(finished) ๋ฐฐ์ด ํ์ฉ
- `visited[now] = 1` : ํ์ฌ ํ์ ๋ฐฉ๋ฌธ ์ฒดํฌ
- `finished[now] = 1` : ํ์ฌ ํ์์ด ์ํ ํ์์ด ์ข ๋ฃ
- ์ฌ์ดํด์ ํ์ธํ๋ ์กฐ๊ฑด
- `visited[next] == 1 && finished[next] == 0` : ๋ฐฉ๋ฌธํ์ ์ ์์ง๋ง, ๋๋์ ์ ์๋๊ฒฝ์ฐ ์ฌ์ดํด ๋ฐ์
- ์ด ๊ฒฝ์ฐ, ์ฌ์ดํด์ ์ด๋ฃจ๊ณ ์๋ ํ์๋ค์ ํ๋์ฉ ์ธ๋ฉฐ cnt++
๐ก ์ฝ๋
public class Baekjoon_9466 {
static int n, cnt;
static int[] nums;
static int[] visited;
static int[] finished;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int t = Integer.parseInt(st.nextToken());
StringBuilder sb = new StringBuilder();
while (t-- > 0) {
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
nums = new int[n + 1];
visited = new int[n + 1];
finished = new int[n + 1];
cnt = 0;
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= n; i++) {
nums[i] = Integer.parseInt(st.nextToken());
}
for (int i = 1; i <= n; i++) {
if (visited[i] == 0) {
dfs(i);
}
}
sb.append(n - cnt).append('\n');
}
System.out.println(sb);
}
static void dfs(int now) {
visited[now] = 1;
int next = nums[now];
if (visited[next] == 0) { // ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ ํ์ ์งํ
dfs(next);
} else if (finished[next] == 0) { // ๋ฐฉ๋ฌธํ ์ ์ ์์ง๋ง ํ์์ด ๋๋์ง ์์ ๊ฒฝ์ฐ (์ฌ์ดํด ๋ฐ์)
int temp = next;
cnt++;
while (temp != now) { // ์ฌ์ดํด์ ์ด๋ฃจ๋ ํ์ ์๋ฅผ ์นด์ดํธ
temp = nums[temp];
cnt++;
}
}
finished[now] = 1; // ํ์ฌ ํ์์ ํ์ ์๋ฃ
}
}
๐ ์๊ฐ ๋ณต์ก๋ ๋ถ์
- ๊ฐ ์ซ์๋ ํ ๋ฒ์ฉ๋ง ๋ฐฉ๋ฌธํ๋ฏ๋ก, ํ ์ฌ์ดํด์ ์ฐพ๋ DFS ํ์์ O(N)
- ์ ์ฒด ํ ์คํธ ์ผ์ด์ค T๊ฐ์ ๋ํด ๋ฐ๋ณต๋๋ฏ๋ก ์ต๋ O(T * N)
- N ≤ 1,000 ์ด๋ฏ๋ก ์ต์ ์ ๊ฒฝ์ฐ O(TN) = O(T * 1,000,000 ) ์ฐ์ฐ.
'์๊ณ ๋ฆฌ์ฆ(JAVA)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 10844 "์ฌ์ด ๊ณ๋จ ์" (JAVA) (0) | 2025.03.04 |
---|---|
๋ฐฑ์ค 2624 "๋์ ๋ฐ๊ฟ์ฃผ๊ธฐ" (JAVA) (0) | 2025.03.02 |
๋ฐฑ์ค 10451 "์์ด ์ฌ์ดํด" (JAVA) (0) | 2025.02.26 |
๋ฐฑ์ค 1194 "๋ฌ์ด ์ฐจ์ค๋ฅธ๋ค, ๊ฐ์" (JAVA) (0) | 2025.02.26 |
๋ฐฑ์ค 2206 "๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ" (JAVA) (0) | 2025.02.22 |