본문 바로가기
코딩/백준-자바

[자바] 백준 2252번: 줄 세우기

by 철없는민물장어 2023. 1. 29.
728x90
반응형

https://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

 

 

위상정렬 알고리즘을 사용하면 된다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class P2252 {
	static int n,m;
	static int[] count;
	static LinkedList<Integer>[] arr;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n=Integer.parseInt(st.nextToken());
		m=Integer.parseInt(st.nextToken());
		
		count= new int[n+1];
		arr=new LinkedList[n+1];
		
		for(int i=1;i<n+1;i++) {
			arr[i]=new LinkedList<>();
		}
		for(int i=0;i<m;i++) {
			st=new StringTokenizer(br.readLine());
			int a=Integer.parseInt(st.nextToken());
			int b=Integer.parseInt(st.nextToken());
			
			arr[a].add(b);
			count[b]++;
		}
		
		topsort();
		
	}
	
	static void topsort() {
		Queue<Integer> q= new LinkedList<>();
		
		for(int i=1;i<n+1;i++) {
			if(count[i]==0)
				q.add(i);
		}
		
		while(!q.isEmpty()) {
			int now=q.poll();
			System.out.print(now+" ");
			
			for(int j=0;j<arr[now].size();j++) {
				int next=arr[now].get(j);
				count[next]--;
				if(count[next]==0)
					q.add(next);
			}
		}
	}

}
728x90
반응형

댓글