알고리즘 문제 풀이

백준 2252 줄 세우기 (JAVA 자바)

superbono 2021. 4. 24. 09:15

문제 출처 - www.acmicpc.net/problem/2252

 

2252번: 줄 세우기

첫째 줄에 N(1≤N≤32,000), M(1≤M≤100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의미이

www.acmicpc.net

 

문제 유형 : 위상 정렬

문제 접근: 처음엔 인접 행렬로 접근했는데 메모리 초과가 떴다. arraylist를 활용한 인접 리스트로 푸니 맞힐 수 있었다. 그래프 문제는 대부분 인접리스트로 푸는게 유리한 것 같다. 

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int M = sc.nextInt();
		List <Integer> adj[] = new ArrayList[N + 1];
		for (int i = 1; i <= N; i++) {
			adj[i]= new ArrayList<>();
		}
		
		int indegree[] = new int[N + 1];
		
		for (int i = 0; i < M; i++) {
			int from = sc.nextInt();
			int to = sc.nextInt();
			
			adj[from].add(to);
			indegree[to]++;
		}
		
		Queue<Integer> q = new LinkedList<>();
		for (int i = 1; i <= N; i++) {
			if(indegree[i] == 0) {
				q.offer(i);
			}
		}
		StringBuilder sb = new StringBuilder();
		while(!q.isEmpty()) {
			int cur = q.poll();
			sb.append(cur).append(" ");
			for (int i = 0; i < adj[cur].size(); i++) {
				if(--indegree[adj[cur].get(i)] == 0) {
						q.offer(adj[cur].get(i));
					}
				}
			}
		System.out.println(sb);
	}
}