728x90
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
백준 2252 <줄 세우기> Python
https://www.acmicpc.net/problem/2252 2252번: 줄 세우기 첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다
dev-diary-0717.tistory.com
파이썬으로 풀었던 문제를 C++ 로 재구성 했습니다.
#include <iostream>
#include <array>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;
int main(void) {
// 입력
int N, M;
cin >> N >> M;
// 자신의 자식 노드들을 기록
array<vector<int>, 32001> children_arr;
// 자신에게 들어오는 노드들의 수를 기록
array<int, 32001> topol_arr{};
// 입력
for (int i = 0; i < M; i++) {
int parent, child;
cin >> parent >> child;
children_arr[parent].push_back(child);
topol_arr[child] += 1;
}
// 줄
vector<int> line;
// 방문 목록
array<bool, 32001> visited;
visited.fill(true);
// 순회
while (line.size() != N) {
// 줄을 세울 목록 큐
deque<int> line_dq;
for (int i = 1; i < N+1; i++) {
// 방문한적 없고 들어오는 노드가 없는 노드
if (visited[i] and topol_arr[i] == 0) {
// 목록 작성
line_dq.push_back(i);
// 방문기록
visited[i] = false;
}
}
// 실제로 줄 세우기
for (auto num : line_dq) {
line.push_back(num);
// 줄 세운 노드가 들어가는 노드
for (auto child : children_arr[num]) {
// 들어가는 수 -1
topol_arr[child] -= 1;
}
}
}
for (auto num : line) {
cout << num << " ";
}
}
728x90
'Coding Test > BaekJoon_C++' 카테고리의 다른 글
백준 1451 <직사각형으로 나누기> C++ (2) | 2024.03.27 |
---|---|
백준 11758 <CCW> C++ (0) | 2024.03.26 |
백준 1717 <집합의 표현> C++ (1) | 2024.03.15 |
백준 11657 <타임머신> C++ (0) | 2024.03.14 |
백준 9935 <문자열 폭발> C++ (0) | 2024.03.13 |