acmicpc

[BAEKJOON] 2668. 숫자고르기

코드와이 2021. 7. 14. 22:51

 

문제링크

https://www.acmicpc.net/problem/2668

 

2668번: 숫자고르기

세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, …, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다. 첫째 줄에서 숫자를 적절

www.acmicpc.net

 

DFS 알고리즘을 사용해서 사이클을 찾는 문제

package acmicpc.Gold5;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class 숫자고르기 {

	static int n, map[];
	static List<Integer> list;
	static boolean visited[];
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		map = new int[n+1];
		visited = new boolean[n+1];
		list = new ArrayList<>();
		
		for(int i = 1 ; i <= n ; i++) {
			map[i] = sc.nextInt();
		}

		for(int i = 1 ; i <= n ; i++) {
			visited[i] = true;
			dfs(i, i);
			visited[i] = false;
		}
		
		Collections.sort(list);
		System.out.println(list.size());
		for(int x : list) System.out.println(x);
	}
	
	public static void dfs(int startIdx, int idx) {
		
		if(!visited[map[startIdx]]) {
			visited[map[startIdx]] = true;
			dfs(map[startIdx], idx);
			visited[map[startIdx]] = false;
		}
		
		if(map[startIdx] == idx) list.add(idx);
		
	}
}