[테스트케이스-1]
1
1
예상결과:
1
1
[테스트케이스-2]
3
3
2
2
예상결과
1
2
[테스트케이스-3]
10
2
3
4
5
6
7
8
9
10
1
예상결과:
10
1
2
3
4
5
6
7
8
9
10
import java.io.*;
import java.sql.Array;
import java.util.*;
/**
* 풀이 과정:
*
*
* 해결방법:
*
* 시간복잡도: O()
* 공간복잡도: O()
*
*/
public class Main {
static List<Integer>[] lists;
static Set<Integer> ans = new TreeSet<>();
static boolean[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
lists = new ArrayList[n+1];
for (int i = 0; i < n + 1; i++) {
lists[i] = new ArrayList<>();
}
for (int i = 1; i < n+1; i++) {
int a = Integer.parseInt(br.readLine());
lists[i].add(a);
}
for (int i = 1; i < n + 1; i++) {
visited = new boolean[n+1];
dfs(n, i, i);
if(!visited[i]){
visited[i] = true;
for (int j = 1; j < n + 1; j++) {
if(visited[j]){
ans.add(j);
}
}
}
}
bw.write(ans.size()+"\n");
for (Integer an : ans) {
bw.write(an+"\n");
}
br.close();
bw.close();
}
private static void dfs(int n, int start, int now) {
// 순환여부 확인,
// 순환상태를 기록할 수 있어야 함
for (Integer i : lists[now]) {
if(i == start){
visited[i] = false;
return;
}
if(!visited[now]){
visited[now] = true;
dfs(n, start, i);
}
}
}
}