ALGORITHM

[JAVA] 백준 2668번- 숫자고르기

연듀 2022. 12. 1. 20:50

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

 

2668번: 숫자고르기

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

www.acmicpc.net

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
    public static boolean[] visited;
    public static int[] arr;
    public static int n, start = 0;
    public static ArrayList<Integer> list = new ArrayList<>();

    public static void dfs(int i) {
        if (arr[i] == start) list.add(start);

        if (!visited[arr[i]]) {
            visited[arr[i]] = true;
            dfs(arr[i]);
            visited[arr[i]] = false;
        }
    }


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        n = Integer.parseInt(br.readLine());

        arr = new int[n + 1];
        visited = new boolean[n + 1];

        for (int i = 1; i <= n; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }

        for (int i = 1; i <= n; i++) {
            visited[i] = true;
            start = i;
            dfs(i);
            visited[i] = false;
        }

        System.out.println(list.size());
        for (int x : list) {
            System.out.println(x + " ");
        }

    }
}

 

 

 

1부터 N까지의 각각의 인덱스에 대해 사이클을 가지고 있는지 확인한다.

 

인덱스 i에 대해 arr[i]가 방문되지 않았다면, dfs(arr[i])를 호출하고

처음 시작한 인덱스인 start와 arr[i]가 같아지면 사이클이므로 start 값을 리스트에 추가한다. 

이 때 인덱스가 작은 값부터 추가되기 때문에 굳이 리스트를 오름차순 정렬해줄 필요는 없다.