본문 바로가기
코딩/문제풀이-백준

백준 2252번 - 줄 세우기 (C++)

by 남대현 2021. 10. 8.
반응형

문제

해결 방법

위상 정렬을 사용하는 대표적인 문제이다. 정점기준 보내주는 간선들의 숫자, 받은 간선의 횟수를 저장하는 배열을 만들어서 이를 기반으로 큐를 사용하여 위상정렬을 했다.

아쉬웠던 점

초기에 큐에 넣는 과정을 입력구간에서 어떻게 잘 해결할 수 있을 것 같기도 한데, 결국 받은 간선을 저장한 배열을 순회하며 그 숫자가 0인 정점을 일일이 찾은게 뭔가 아쉽다.

코드

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
#include <iostream>
#include <vector>
#include <queue>
 
using namespace std;
 
int main() 
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int N, M;
    cin >> N >> M;
    pair<intint> Input_Pair;
    vector<int> In_Vec(N, 0); //A에 위치한 숫자. 간선 받은 횟수를 저장함.
    vector<vector<int>> Out_Vec(N); //B에 위치한 숫자들 저장. 간선 보내는 애들기준 어디로 보냈는지 저장함.
    for (int i = 0; i < M; ++i)
    {
        cin >> Input_Pair.first >> Input_Pair.second;
        In_Vec[Input_Pair.first - 1]++;
        Out_Vec[Input_Pair.second-1].emplace_back(Input_Pair.first - 1);
    }
 
    queue<int> Topological_Que;
    vector<int> Sort_Vec(N, 0);
    for (int i = 0 ; i < N; ++i) //초기부터 들어오는 간선이 0개인애들 큐에 넣어줌.
        if (In_Vec[i] == 0)
            Topological_Que.emplace(i);
 
    int Count = 0;
    while (!Topological_Que.empty())
    {
        for (auto i : Out_Vec[Topological_Que.front()]) //큐의 맨 앞 숫자에서 보내주는 간선들을 모두 삭제함 = 간선을 받는곳의 간선 갯수 -1 해줌.
        {
            In_Vec[i]--;
            if (In_Vec[i] == 0//이때 받는곳의 간선이 0이 되었다면, 큐에 추가해줌.
                Topological_Que.push(i);
        }
        Sort_Vec[Count] = Topological_Que.front(); //정렬된 곳에 저장. (오름차순)
        Topological_Que.pop();
        Count++;
    }
 
    //오름차순으로 저장했기 때문에 역순으로 출력. 편의성을 위해 숫자를 1~N까지에서 0~N-1까지로 위에서 조정해주었기 때문에 출력값에 +1해줌.
    for (int i = N-1; i >= 0--i) 
        cout << Sort_Vec[i]+1 << " ";
}
cs

잡설 : 이왜골2?

 

반응형

'코딩 > 문제풀이-백준' 카테고리의 다른 글

백준 10282번 - 해킹 (C++)  (2) 2021.11.03
백준 13460번 - 구슬 탈출 2 (C++)  (0) 2021.10.26
백준 9661번 - 돌 게임 7 (C++)  (0) 2021.10.02
백준 11438번 - LCA2 (C++)  (0) 2021.10.02
백준 5430번 - AC (C++)  (0) 2021.10.02

댓글