[BOJ] 2668. 숫자 고르기
15 Apr 2026
Reading time ~1 minute
풀이
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
static Scanner sc=new Scanner(System.in);
static int N,cnt;
static boolean visit[];
static List<Integer> vertex[];
static List<Integer> list=new ArrayList<Integer>();
static List<Integer> answer=new ArrayList<Integer>();
static int visitCnt;
static boolean flag;
public static void main(String[] args) {
init();
for (int i = 1; i <= N ; i++) {
visitCnt=0;
list.clear();
visit=new boolean[N+1];
for (int j = 0; j < answer.size(); j++) {
visit[answer.get(j)]=true;
}
flag=false;
if(visit[i]) continue;
if(!go(i)) continue;
for (int j = 0; j < list.size(); j++) {
answer.add(list.get(j));
}
}
System.out.println(answer.size());
Collections.sort(answer);
for (int i = 0; i < answer.size(); i++) {
System.out.println(answer.get(i));
}
}
//싸이클 체크 함수.
public static boolean go(int v) {
if(visit[v]) {
if(v==list.get(0)) {
flag=true;
return flag;
}
return flag;
}
visit[v]=true;
list.add(v);
visitCnt++;
for (int i = 0; i < vertex[v].size(); i++) {
int nv=vertex[v].get(i);
go(nv);
}
return flag;
}
public static void init() {
N=sc.nextInt();
vertex=new List[N+1];
for (int i = 1; i <= N; i++) {
vertex[i]=new ArrayList<Integer>();
}
for (int i = 1; i <= N; i++) {
int nv=sc.nextInt();
vertex[i].add(nv);
if(i==nv) {
answer.add(i);
cnt++;
}
}
}
}