백준 9466 '텀 프로젝트'

Bonwoong Ku·2023년 11월 7일
0

알고리즘 문제풀이

목록 보기
81/110

아이디어

  • 사이클을 감지해야한다는 점에서 위상정렬을 시도해봤다.

코드

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

public class Main {
	static BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
	static StringBuilder sb = new StringBuilder();
	static StringTokenizer tk = null;
	
	static int T, n, ans;
	static int[] A;
	
	static Queue<Integer> q = new ArrayDeque<>();
	static int[] indeg;

	public static void main(String[] args) throws Exception {
		T = Integer.parseInt(rd.readLine());
		for (int t=1; t<=T; t++) {
			n = Integer.parseInt(rd.readLine());
			
			A = new int[n+1];
			indeg = new int[n+1];
			tk = new StringTokenizer(rd.readLine());
			for (int i=1; i<=n; i++) {
				A[i] = Integer.parseInt(tk.nextToken());
				indeg[A[i]]++;
			}

			ans = 0;
			q.clear();
			for (int i=1; i<=n; i++) {
				if (indeg[i] == 0) {
					q.add(i);
					ans++;
				}
			}
			
			while (!q.isEmpty()) {
				int n = q.poll();
				indeg[A[n]]--;
				if (indeg[A[n]] == 0) {
					q.add(A[n]);
					ans++;
				}
			}
			
			sb.append(ans).append('\n');
		}
		System.out.println(sb);
	}


}

메모리 및 시간

  • 메모리: 305408 KB
  • 시간: 1104 ms

리뷰

  • 2668번(내 풀이)이랑 같은 문제인 줄 알았는데, N의 범위가 훨씬 더 커서 당황스러웠다.
  • 풀긴 풀었는데, 메모리와 시간을 봐서 정해는 아닌 것 같다. 더 효율적인 풀이를 찾아봐야겠다. 혹시 똑같이 풀면 풀리나?
profile
유사 개발자

0개의 댓글