Skip to content

Instantly share code, notes, and snippets.

@bellaah
Created March 21, 2019 09:53
BOJ 백준 2252 줄세우기
import java.io.*;
import java.util.*;
public class Main {
static int[] degree;
static List<List<Integer>> graph;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
Queue<Integer> queue=new LinkedList();
int n=Integer.parseInt(st.nextToken()); //학생 수
int m=Integer.parseInt(st.nextToken());
int a,b;
graph=new ArrayList<>(); //인접리스트
degree=new int[n+1]; //차수
for(int i=1; i<=n+1; i++) { //리스트 생성
graph.add(new ArrayList<>());
}
for(int i=0; i<m; i++) { //m만큼의 입력을 받는다.
st = new StringTokenizer(br.readLine());
a=Integer.parseInt(st.nextToken());
b=Integer.parseInt(st.nextToken());
graph.get(a).add(b);
degree[b]++;
}
for(int i=1; i<=n; i++) {
if(degree[i]==0) { //degree가 0이면 큐에 넣는다.
queue.add(i);
degree[i]=-1; //이미 큐에 들어갔다는 것을 표시
}
}
for(int i=0; i<n; i++) {
if(!queue.isEmpty()) {
int x = queue.poll(); //큐에서 뺸 값을
bw.write(x+" "); //출력
for(int j=0; j<graph.get(x).size(); j++) { //큐에서 뺀 x의 인접리스트
degree[graph.get(x).get(j)]--; //인접리스트에 있는 데이터들의 degree를 1씩 감소
if(degree[graph.get(x).get(j)]==0) { //degree가 0 이라면
queue.add(graph.get(x).get(j)); //큐에 추가
degree[graph.get(x).get(j)]=-1; //큐에
}
}
}
else{
break;
}
bw.flush();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment