[백준] 2668: 숫자고르기 - JAVA
https://www.acmicpc.net/problem/2668
풀이
사이클을 찾는 문제이다.
arr[i] -> arr[arr[i]]
이런식으로 뽑힌 정수를 인덱스로 하는 숫자를 다시 봐야한다.
처음 시작한 숫자와 같은 숫자가 나오면 사이클이 완성된다.
dfs탐색을 통해 뽑힌 정수를 인덱스로 하여 탐색했고 처음 숫자가 나왔을 때 list에 넣었다.
메모리: 14216KB
시간: 128ms
언어: Java 11
코드
import java.util.*;
import java.io.*;
public class Main {
static int[] arr;
static ArrayList<Integer> list;
static boolean[] visit;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
arr = new int[N + 1];
for (int i = 1; i < N + 1; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
list = new ArrayList<>();
visit = new boolean[N + 1];
for (int i = 1; i < N + 1; i++) {
visit[i] = true;
dfs(i, i);
visit[i] = false;
}
Collections.sort(list);
System.out.println(list.size());
list.stream().forEach(System.out::println);
}
private static void dfs(int idx, int st) {
if (arr[idx] == st) {
list.add(st);
}
if (!visit[arr[idx]]) {
visit[arr[idx]] = true;
dfs(arr[idx], st);
visit[arr[idx]] = false;
}
}
}