happy318
팽도리블로그
happy318
전체 방문자
오늘
어제
  • 전체글 (252)
    • 공부 (5)
      • Algorithm 정리 (0)
      • 논문리뷰 (1)
      • C++ (2)
      • Python (2)
      • Java (0)
      • Back-end (0)
      • Front-end (0)
      • Embedded (0)
    • 코딩테스트 (218)
      • Python 문제풀이 (100)
      • C++ 문제풀이 (108)
      • Python template (9)
      • C++ template (1)
    • 일상 (20)
      • 맛집 (13)
      • 쇼핑 (5)
      • 아무 일상 (2)
    • 게임 (9)
      • 메이플스토리 (9)

최근 글

인기 글

hELLO · Designed By 정상우.
happy318

팽도리블로그

코딩테스트/C++ 문제풀이

[백준] 줄 세우기

2023. 3. 12. 15:31

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

우선 문제부터 간단하게 요약하면, 

 

학생들을 줄 세우는데, 두 학생의 키 비교 결과만 주어질 때, 해당 모든 조건을 만족하도록 학생들을 줄세워 출력하는 문제입니다.

 

<Solution>

전형적인 위상정렬의 문제로 위상정렬을 구현하면 됩니다. 실제 구현은 아래와 같습니다.

#include <iostream>
#include <queue>

using namespace std;

int N, M;

queue <int> nodeQ;
int indegree[32000+1];
vector<int> graph[32000+1]; // 인접리스트

vector<int> ans;

int main(){

    cin >> N >> M;
    int s,e;

    for(int i = 0 ; i<M ;i++){
        cin >> s >> e;
        graph[s].push_back(e); // 인접리스트 update
        indegree[e] += 1; // 진입차수 증가
    }

    // topological sort
    for(int i = 1; i<N+1; i++){
        if(indegree[i]) continue;
        nodeQ.push(i);
    }

    while(!nodeQ.empty()){
        int node = nodeQ.front(); nodeQ.pop();
        ans.push_back(node);

        for(int i : graph[node]){
            indegree[i]--;
            if(!indegree[i]) nodeQ.push(i);
        }
    }

    for(int i : ans){
        cout << i << ' ';
    }
    cout << endl;

    return 0;
}
반응형

'코딩테스트 > C++ 문제풀이' 카테고리의 다른 글

[LeetCode] Path Sum II  (0) 2023.03.21
[백준] 3의 배수  (0) 2023.03.20
[백준] 용액  (0) 2023.03.12
[백준] 부분합  (0) 2023.03.05
[백준] 도시 분할 계획  (0) 2023.03.05
    '코딩테스트/C++ 문제풀이' 카테고리의 다른 글
    • [LeetCode] Path Sum II
    • [백준] 3의 배수
    • [백준] 용액
    • [백준] 부분합
    happy318
    happy318

    티스토리툴바