Algorithm/백준

백준 - 문제집

whyWhale 2023. 4. 30.

문제 설명

가장 쉬운 문제부터 풀수 있는 과정을 출력하는 문제이다.

단, 문제마다 먼저 풀어야 하는 문제를 모두 풀어야 다음 문제를 풀어야 한다.

주의사항

문제는 난이도 순서로 출제되어 있다. 즉 1번 문제가 가장 쉬운 문제이고 N번 문제가 가장 어려운 문제가 된다.

이점을 생각하면 낮은 번호의 문제부터 풀어야 하므로 일반 큐가 아닌 우선순위 큐를 이용해야 한다.

풀이

public static void main(String[] args) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(reader.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());

		int[] indegrees = new int[n + 1];

		List<Integer> adj[] = new List[n + 1];

		for (int i = 1; i <= n; i++) {
			adj[i] = new ArrayList<>();
		}

		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(reader.readLine());
			int from = Integer.parseInt(st.nextToken());
			int to = Integer.parseInt(st.nextToken());
			adj[from].add(to);
			indegrees[to]++;
		}

		PriorityQueue<Integer> q = new PriorityQueue<>(); // 일반 큐로 하면 3,4,1,2 | (3,4) -> 진입차수 0인거 넣고
		for (int i = 1; i <= n; i++) {
			if (indegrees[i] == 0)
				q.offer(i);
		}

		StringBuilder answer = new StringBuilder();
		while (!q.isEmpty()) {
			Integer cur = q.poll();
			answer.append(cur+" ");
			for (Integer next : adj[cur]) {
				indegrees[next]--;

				if(indegrees[next]==0){
					q.offer(next);
				}
			}
		}

		System.out.println(answer);
	}

'Algorithm > 백준' 카테고리의 다른 글

백준 - 철로  (0) 2023.05.04
백준 - 순회강연  (0) 2023.05.02
백준 - 가운데를 말해요  (0) 2023.04.29
백준 - 죽음의 비  (0) 2023.04.25
백준 - 좋은 수열  (0) 2023.04.25

댓글