์ƒˆ์†Œ์‹

๋ฐ˜์‘ํ˜•
Algorithm

๋ฐฑ์ค€ 2668 ์ˆซ์ž๊ณ ๋ฅด๊ธฐ[JAVA]

  • -
๋ฐ˜์‘ํ˜•

์„ธ๋กœ ๋‘ ์ค„, ๊ฐ€๋กœ๋กœ N๊ฐœ์˜ ์นธ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ‘œ๊ฐ€ ์žˆ๋‹ค. ์ฒซ์งธ ์ค„์˜ ๊ฐ ์นธ์—๋Š” ์ •์ˆ˜ 1, 2, …, N์ด ์ฐจ๋ก€๋Œ€๋กœ ๋“ค์–ด ์žˆ๊ณ  ๋‘˜์งธ ์ค„์˜ ๊ฐ ์นธ์—๋Š” 1์ด์ƒ N์ดํ•˜์ธ ์ •์ˆ˜๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค. ์ฒซ์งธ ์ค„์—์„œ ์ˆซ์ž๋ฅผ ์ ์ ˆํžˆ ๋ฝ‘์œผ๋ฉด, ๊ทธ ๋ฝ‘ํžŒ ์ •์ˆ˜๋“ค์ด ์ด๋ฃจ๋Š” ์ง‘ํ•ฉ๊ณผ, ๋ฝ‘ํžŒ ์ •์ˆ˜๋“ค์˜ ๋ฐ”๋กœ ๋ฐ‘์˜ ๋‘˜์งธ ์ค„์— ๋“ค์–ด์žˆ๋Š” ์ •์ˆ˜๋“ค์ด ์ด๋ฃจ๋Š” ์ง‘ํ•ฉ์ด ์ผ์น˜ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค๋„๋ก ์ •์ˆ˜๋“ค์„ ๋ฝ‘๋˜, ์ตœ๋Œ€๋กœ ๋งŽ์ด ๋ฝ‘๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด, N=7์ธ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๊ณ  ํ•˜์ž.

์ด ๊ฒฝ์šฐ์—๋Š” ์ฒซ์งธ ์ค„์—์„œ 1, 3, 5๋ฅผ ๋ฝ‘๋Š” ๊ฒƒ์ด ๋‹ต์ด๋‹ค. ์ฒซ์งธ ์ค„์˜ 1, 3, 5๋ฐ‘์—๋Š” ๊ฐ๊ฐ 3, 1, 5๊ฐ€ ์žˆ์œผ๋ฉฐ ๋‘ ์ง‘ํ•ฉ์€ ์ผ์น˜ํ•œ๋‹ค. ์ด๋•Œ ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๋Š” 3์ด๋‹ค. ๋งŒ์•ฝ ์ฒซ์งธ ์ค„์—์„œ 1๊ณผ 3์„ ๋ฝ‘์œผ๋ฉด, ์ด๋“ค ๋ฐ”๋กœ ๋ฐ‘์—๋Š” ์ •์ˆ˜ 3๊ณผ 1์ด ์žˆ์œผ๋ฏ€๋กœ ๋‘ ์ง‘ํ•ฉ์ด ์ผ์น˜ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ด ๊ฒฝ์šฐ์— ๋ฝ‘ํžŒ ์ •์ˆ˜์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋‹ต์ด ๋  ์ˆ˜ ์—†๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” N(1≤N≤100)์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ ํ•˜๋‚˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ๋Š” ํ‘œ์˜ ๋‘˜์งธ ์ค„์— ๋“ค์–ด๊ฐ€๋Š” ์ •์ˆ˜๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ž…๋ ฅ๋œ๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฝ‘ํžŒ ์ •์ˆ˜๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ๋Š” ๋ฝ‘ํžŒ ์ •์ˆ˜๋“ค์„ ์ž‘์€ ์ˆ˜๋ถ€ํ„ฐ ํฐ ์ˆ˜์˜ ์ˆœ์„œ๋กœ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ•œ๋‹ค.


๊ฐ ๋ฐฐ์—ด์˜ ์ˆซ์ž๋“ค์ด ์‚ฌ์ดํด์„ ์ด๋ฃจ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์œ„์˜ ์˜ˆ์ œ๋กœ ๋”ฐ์ ธ๋ณด๋ฉด 1-3 3-1๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”๋ฐ ์ธ๋ฑ์Šค์™€ ๋ฐธ๋ฅ˜์˜ ์ง‘ํ•ฉ์ด ๋™์ผํ•˜๋ ค๋ฉด ์‚ฌ์ดํด์ด ์กด์žฌํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฐธ๋ฅ˜(3) -> ์ธ๋ฑ์Šค ๊ฒ€์ƒ‰(1), ๊ฒ€์ƒ‰๋œ ๋ฐธ๋ฅ˜(3) -> ์ธ๋ฑ์Šค ๊ฒ€์ƒ‰(1) ๋ฐ˜๋ณตํ•˜๋‹ค ๋ณด๋ฉด ์‚ฌ์ดํด์ด ์ƒ๊ธด๋‹ค. ํ•ด๋‹น ์‚ฌ์ดํด์„ ์ถ”์ถœํ•ด๋‚ด๋Š” ๊ฒƒ์ด ์ฃผ์š” ํฌ์ธํŠธ์˜€๋‹ค.


1. ๋ณ€์ˆ˜ ์„ ์–ธ์€ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ํ•˜์˜€๋‹ค. N์˜ ๊ฐ’, ๋ฐฐ์—ด์„ ์ €์žฅํ•  arr๋ฐฐ์—ด, ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€๋ฅผ ํ‘œ์‹œํ•  visited๋ฐฐ์—ด, ์‚ฌ์ดํด์ด ์กด์žฌํ•  ๊ฒฝ์šฐ ํ•ด๋‹น์ˆซ์ž๊ฐ€ ์‚ฌ์ดํด์— ํฌํ•จ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  cycle๋ฐฐ์—ด, ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ ์“ธ result ํ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.

    static int N;
    static int[] arr;
    static boolean[] visited;
    static boolean[] cycle;
    static Queue<Integer> result = new LinkedList();

2.N์˜  ๊ฐ’๊ณผ ๋ฐฐ์—ด๋“ค์„ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๊ณ  arr๋ฐฐ์—ด์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

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

        arr = new int[N + 1];
        visited = new boolean[N + 1];
        cycle = new boolean[N + 1];

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

 

3.์‚ฌ์ดํด์„ ์ฒดํฌํ•  ํ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์‚ฌ์ดํด์ด ์กด์žฌํ•˜๊ฑฐ๋‚˜, ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ๋˜ ์ˆซ์ž์ผ ๊ฒฝ์šฐ ๋•Œ๊นŒ์ง€, ์ธ๋ฑ์Šค-๋ฐฐ์—ด[๋ฐธ๋ฅ˜1]-๋ฐฐ์—ด[๋ฐธ๋ฅ˜2] ์˜ ํ˜•์‹์œผ๋กœ ๊ณ„์† ๊ฒ€์ƒ‰ํ•˜๊ณ  ํ์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. ์‚ฌ์ดํด์ด ์ƒ๊ฒผ๋”๋ผ๋„ ํ์—๋Š” ์ „์ฒด ์ˆซ์ž๋“ค์ด ์‚ฌ์ดํด์— ํฌํ•จ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์‚ฌ์ดํด์ด ์‹œ์ž‘๋œ ๋ฒˆํ˜ธ๊นŒ์ง€ ํ์—์„œ ์ž๋ฅด๊ณ  ์‚ฌ์ดํด์ด ์‹œ์ž‘๋œ ๋ฒˆํ˜ธ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ ์‚ฌ์ดํด ๋ฐฐ์—ด์— ํฌํ•จ์‹œ์ผœ์ค€๋‹ค.

 

        for (int i = 1; i <= N; i++) {

            if(!visited[i]) {
                Queue<Integer> q = new LinkedList<>();

                q.add(i);

                int number = arr[i];

                while(!visited[number]) {
                    q.add(number);
                    visited[number] = true;
                    number = arr[number];
                }

                if (q.contains(number)) {
                    while(q.peek() != number) {
                        q.poll();
                    }

                    while (!q.isEmpty()) {
                        cycle[q.poll()] = true;
                    }

                }
             }
        }
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

class Main {

    static int N;
    static int[] arr;
    static boolean[] visited;
    static boolean[] cycle;
    static Queue<Integer> result = new LinkedList();

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

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

        arr = new int[N + 1];
        visited = new boolean[N + 1];
        cycle = new boolean[N + 1];

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

        for (int i = 1; i <= N; i++) {

            if(!visited[i]) {
                Queue<Integer> q = new LinkedList<>();

                q.add(i);

                int number = arr[i];

                while(!visited[number]) {
                    q.add(number);
                    visited[number] = true;
                    number = arr[number];
                }

                if (q.contains(number)) {
                    while(q.peek() != number) {
                        q.poll();
                    }

                    while (!q.isEmpty()) {
                        cycle[q.poll()] = true;
                    }

                }
             }
        }

        for (int i = 1; i <= N; i++) {
            if(cycle[i]){
                result.offer(i);
            }
        }

        System.out.println(result.size());

        while (!result.isEmpty()) {
            System.out.println(result.poll());
        }
    }
}

 

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.