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

 

2668번: 숫자고르기

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

www.acmicpc.net

 

문제해설

DFS 문제입니다.

각 사이클을 구할떄 DFS를 통해서 계속해서 파고 들어가다가 해당 인덱스가 다시 나오면 사이클이 발생했다고 판단하면 되는 문제입니다.

헷갈리는 문제였습니다.

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static int N;
public static int[][] map;
public static boolean[] visited;
public static ArrayList<Integer> list = new ArrayList<>();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
map = new int[2][N+1];
visited = new boolean[N+1];
for(int i=1;i<=N;i++) {
map[0][i] = i;
map[1][i] = Integer.parseInt(br.readLine());
}
for(int i=1;i<=N;i++) {
visited[i] = true;
DFS(i, i);
visited[i] = false;
}
// Collections.sort(list); 어처피 map[0][N+1] 은 모두 1 2 3 4 5 6 7 .. 이렇게 오름차순 되어있으므로 Sort를 안해도됩니다.
System.out.println(list.size());
for(int i = 0;i<list.size();i++) {
System.out.println(list.get(i));
}
}
public static void DFS(int start, int target) {
if(visited[ map[1][start] ] == false) {
visited[ map[1][start]] = true;
DFS( map[1][start] , target);
visited[ map[1][start]] = false;
}
if(map[1][start] == target) list.add(target);
}
}

+ Recent posts