ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ] 문제집
    Algorithm/BOJ 2020. 11. 30. 15:00

    [1766] 문제집

    www.acmicpc.net/problem/1766

     

     

    Solution

    • N개의 문제를 모두 풀어야하는데, 문제 풀이 순서에 있어 두 가지 조건을 고려해야한다.
    • 첫째, 숫자가 작은 문제부터 풀어야한다.
    • 둘째, 먼저 풀어야하는 길잡이 문제부터 풀어야 한다.
    • 일반적인 위상정렬에서 q를 오름차순 pq로 바꾸어 쉽게 풀 수 있었다.
    • 알고리즘 분류가 우선순위 큐로 되어있길래 풀었는데, 위상정렬 문제였다. 덕분에 위상정렬 공부까지 했음.

    4ngeunlee.tistory.com/365

     

    [Algorithm] 위상 정렬

    위상 정렬 방향이 있는 그래프의 순서 정렬 위상 정렬이 가능하려면 DAG(Directed Acycle Graph, 방향성이 있으며 사이클이 없는 그래프)이여야 한다. 위상 정렬을 구현하는 방법에는 DFS를 사용하거나 i

    4ngeunlee.tistory.com

     

     

    소스코드

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.*;
     
    public class Main {
        static int n, m;
        static int[] indegree;
        static List<List<Integer>> graph;
        static StringBuilder sb;
     
     
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
            n = stoi(st.nextToken());
            m = stoi(st.nextToken());
     
            graph = new ArrayList<>();
            for (int i = 0; i <= n; i++) {
                graph.add(new ArrayList<>());
            }
            indegree = new int[n + 1];
     
            int a, b;
            for (int i = 0; i < m; i++) {
                st = new StringTokenizer(br.readLine());
                a = stoi(st.nextToken());
                b = stoi(st.nextToken());
     
                graph.get(a).add(b);
                indegree[b]++;
            }
     
            topologicalSort();
     
            System.out.println(sb.toString().trim());
        }
     
        private static void topologicalSort() {
            PriorityQueue<Integer> pq = new PriorityQueue<>();
     
            for (int i = 1; i < indegree.length; i++) {
                if(indegree[i] == 0){
                    pq.offer(i);
                }
            }
     
            sb = new StringBuilder();
            while (!pq.isEmpty()) {
                int p = pq.poll();
                sb.append(p + " ");
     
                for (int node : graph.get(p)) {
                    indegree[node]--;
     
                    if (indegree[node] == 0) {
                        pq.offer(node);
                    }
                }
            }
        }
     
        private static int stoi(String s) {
            return Integer.parseInt(s);
        }
     
    }
    cs

    'Algorithm > BOJ' 카테고리의 다른 글

    [BOJ] 청소년 상어  (0) 2021.01.19
    [BOJ] 아기상어  (0) 2021.01.12
    [BOJ] 행성 터널  (0) 2020.11.28
    [BOJ] 진우의 민트초코우유  (0) 2020.11.27
    [BOJ] 인구 이동  (0) 2020.10.28

    댓글

Designed by Tistory.