본문 바로가기
알고리즘/위상정렬

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

by 박뀨뀨 2024. 3. 1.
 

2668번: 숫자고르기

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

www.acmicpc.net

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;

public class Main {
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int N = Integer.parseInt(br.readLine());
		
		int[] A = new int[N + 1];
		int[] inDegree = new int[N + 1];
		
		for (int i = 1; i <= N; i++) {
			A[i] = Integer.parseInt(br.readLine());
			inDegree[A[i]]++;
		}
		
		Queue<Integer> q = new ArrayDeque<>();
		for (int i = 1; i <= N; i++) {
			if (inDegree[i] == 0) {
				q.offer(i);
			}
		}
		
		while (!q.isEmpty()) {
			int cur = q.poll();
			
			int next = A[cur];
			
			if (--inDegree[next] == 0) {
				q.offer(next);
			}
		}
		
		int count = 0;
		for (int i = 1; i <= N; i++) {
			if (inDegree[i] != 0)
				count++;
		}
		sb.append(count).append("\n");
		for (int i = 1; i <= N; i++) {
			if (inDegree[i] != 0)
				sb.append(i).append("\n");
		}
		
		System.out.print(sb);
	}
}
728x90