코딩뚠뚠

[백준문제풀이] 2252 줄 세우기 본문

알고리즘 문제풀이/백준문제풀이

[백준문제풀이] 2252 줄 세우기

로디네로 2020. 12. 29. 01:36
반응형

 

풀이일시 : 2020-08-19

 

문제 :

N명의 학생들을 키 순서대로 줄을 세우려고 한다. 각 학생의 키를 직접 재서 정렬하면 간단하겠지만, 마땅한 방법이 없어서 두 학생의 키를 비교하는 방법을 사용하기로 하였다. 그나마도 모든 학생들을 다 비교해 본 것이 아니고, 일부 학생들의 키만을 비교해 보았다.

일부 학생들의 키를 비교한 결과가 주어졌을 때, 줄을 세우는 프로그램을 작성하시오.

 

입력:

첫째 줄에 N(1≤N≤32,000), M(1≤M≤100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의미이다.

학생들의 번호는 1번부터 N번이다.

ex)

3 2 //3번이 2번보다 앞

1 3

2 3

 

출력:

첫째 줄부터 앞에서부터 줄을 세운 결과를 출력한다. 답이 여러 가지인 경우에는 아무거나 출력한다.

ex)

1 2 3

 

풀이 :

줄을 세우는 규칙이 비교에 의한 순서이니 위상정렬의 문제이다.

 

dbstndi6316.tistory.com/56

 

[기본문제풀이] topology_sort

풀이 일시 : 2020-08-16 ​ 위상정렬 : 순서가 정해져 있는 작업을 차례로 수행해야 할 때 순서를 결정하기 위해 큐 사용 ​ 문제 : topology sort 수행 ​ 시간복잡도 : O(V+E) ​ 풀이 : #include #include #inc..

dbstndi6316.tistory.com

queue를 이용한다.

입력 시 연결이 되는 link node에 진입차수를 ++ 해주고 topologySort 함수내에서 연결노드면 진입차수를 -- 한다. 이 과정 후에 진입차수가 0이 된다면 큐에 넣어준다.

 

#include <iostream>
#include <vector>
#include <queue>
#define MAX 32001
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
	
int n, inDegree[MAX], result[MAX];
vector <int> a[MAX];

void topologySort() {
    queue<int> q;
    for (int i = 1; i <= n; i++) {
        if (inDegree[i] == 0) { //차수가 0인걸 일단 큐에 넣는다.
            q.push(i);
        }
    }
    for (int i = 1; i <= n; i++) { //돌아가면서 조건에맞는걸 계속 큐에 넣고 맨앞에있는거 빼고 반복
        int x = q.front();
        q.pop();
        result[i] = x; //큐 맨앞에있는걸 꺼내고 result에 넣는다
        for (int j = 0; j < a[x].size(); j++) { //연결노드들 확인
            int y = a[x][j]; //그 연결노드를 y로 정의
            if (--inDegree[y] == 0) //차수를 1뺐을 때 y의 진입차수가 0이되면
                q.push(y); //큐에넣는다.
        }
    }
    for (int i = 1; i <= n; i++) {
        printf("%d ", result[i]);
    }
}

int main() {
    int m;
    int x, y;

    scanf_s("%d %d",&n,&m);
    for (int i = 0; i < m; i++) {
        scanf_s("%d %d", &x, &y); //input
        a[x].push_back(y); //연결
        inDegree[y]++; //연결 되는 것의 차수를 1 늘려준다.
    }
    topologySort();
}
반응형