본문 바로가기

백준

[ 백준 1766 ] 문제집 (c/c++)

https://www.acmicpc.net/problem/1766

 

 

[ 문제 요약 ]

문제가 난이도 순서로 출제되어 있는 문제집에서 문제를 난이도 순서대로 푼다. 먼저 푸는 것이 좋은 문제가 있는 문제는, 먼저 푸는 것이 좋은 문제를 반드시 먼저 풀어야 할 때, 문제 푸는 순서를 출력한다.

 

 

[ 문제 풀이 ]

1. 먼저 푸는 것이 좋은 문제가 있는 문제의 경우 위상정렬을 이용해서 문제의 순서를 정해준다.

2. 이때 그냥 큐를 사용해서 위상정렬을 할 경우에는 문제의 난이도 순서를 고려하지 못한다.

3. 우선순위 큐를 이용해서 먼저 푸는 것을 풀 되 순서가 없는 경우 난이도가 쉬운 것부터 가져온다.

 

 

[ 소스 코드 ]

#include <bits/stdc++.h>
using namespace std;

int N, M;
int IN[32323];
vector<int> v[32323];
priority_queue<int, vector<int>, greater<int>> pq;

int main() {
    cin >> N >> M;
    for (int i=0; i<M; i++){
        int a, b;
        cin >> a >> b;
        v[a].push_back(b);
        IN[b]++;
    }

    for (int i=1; i<=N; i++) if(!IN[i]) pq.push(i);

    while (!pq.empty()){
        int cur = pq.top(); pq.pop();
        cout << cur << " ";
        for (auto i : v[cur]) if (!--IN[i]) pq.push(i);
    }
    
    return 0;
}

 

 

[ 주의할 점 ]

문제의 난이도 순서대로 주어지기 때문에 우선 순위 큐와 위상정렬을 이용해서 쉽게 구할 수 있었다.

'백준' 카테고리의 다른 글

[ 백준 1107 ] 리모컨 (c/c++)  (0) 2025.03.05
[ 백준 1038 ] 감소하는 수 (c/c++)  (0) 2025.03.04
[ 백준 1167 ] 트리의 지름 (c/c++)  (0) 2024.11.20
[ 백준 1005 ] ACM Craft (c/c++)  (2) 2024.11.19
[ 백준 16236 ] 아기상어 (c/c++)  (0) 2024.11.18