입력 : 첫째 줄 - 테스트 케이스 개수 T
각 테스트 케이스에 대한 첫번째 줄 - 순열의 크기 N (2 ≤ N ≤ 1,000)
각 테스트 케이스에 대한 두번째 줄 - 순열
출력 : 각 테스트 케이스마다 입력으로 주어진 순열에 존재하는 순열 사이클의 개수
O(V + E)
V : 정점의 수
E : 간선의 수
DFS
import java.util.*;
public class Main {
private static int[] arr;
private static boolean[] visited;
private static int n;
private static void dfs(int start) {
if (visited[start]) return;
visited[start] = true;
dfs(arr[start]); // 다음 연결된 노드로 이동
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt(); // 테스트 케이스의 수
while (T-- > 0) {
n = scanner.nextInt(); // 순열의 크기
arr = new int[n + 1];
visited = new boolean[n + 1];
for (int i = 1; i <= n; i++) {
arr[i] = scanner.nextInt(); // 순열 입력
}
int cycleCount = 0;
for (int i = 1; i <= n; i++) {
if (!visited[i]) {
dfs(i);
cycleCount++; // 새로운 사이클 발견
}
}
System.out.println(cycleCount);
}
scanner.close();
}
}