문제 링크: 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

 

 

 

키를 정렬하는데 있어서 약간의 순서를 줬다. 즉 어떤 학생 앞에는 정해진 학생이 앞에 있어야 하는 것이다. 

arr배열에 조건의 수를 적어주고 list[해당 학생].add(앞에 서야하는 학생)식으로 선언해준다. arr[학생]==0 일 경우에 StringBuilder에 추가해주며 해당 학생 앞에 서야하는 학생의 arr을 낮춰준다. 이때 낮춰준 학생의 arr==0을 만족할 경우 queue에 넣어준다.

 

import java.util.*;
import java.io.*;

public class Main {

    static int n;
    static int m;
    static int[] arr;
    static StringBuilder sb = new StringBuilder();
    static List<Integer>[] list;
    static Queue<Integer> queue = new LinkedList<>();

    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] s = br.readLine().split(" ");
        n = Integer.parseInt(s[0]);
        m = Integer.parseInt(s[1]);

        list = new ArrayList[n + 1];
        arr = new int[n + 1];

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

        for (int i = 0; i < m; i++) {
            String[] s1 = br.readLine().split(" ");
            int before = Integer.parseInt(s1[0]);
            int post = Integer.parseInt(s1[1]);
            arr[post]++; // 조건 수 증가. 
            list[before].add(post); // 해당 학생의 앞에 서야하는 학생들을 넣어준다. 
        }

        for (int i = 1; i <= n; i++) {
            if(arr[i]==0){
                queue.add(i); // 조건이 없는 학생들을 넣어준다. 
            }
        }

        while (!queue.isEmpty()){
            Integer poll = queue.poll();
            sb.append(poll+" "); // 조건을 만족하는 학생들을 넣어준다. 
            for(Integer a: list[poll]){
                arr[a]--; // 해당 학생을 앞에 세워야 하는 조건을 가진 학생들의 값을 낮춰준다.
                if(arr[a]==0){
                    queue.add(a);
                }
            }
        }
        System.out.println(sb.toString());
    }
}

 

 

 

'Alogorithm > 위상정렬' 카테고리의 다른 글

백준 1516[자바] java 게임 개발  (0) 2022.05.22
백준 1766 [자바] java 문제집  (0) 2022.02.09
백준 1005 [자바] java ACM Craft  (0) 2022.01.09
백준 JAVA 14567번 선수과목  (0) 2021.12.18