728x90
SMALL
백준 문제 풀이: 2623 [음악프로그램]
문제 링크: https://www.acmicpc.net/problem/2623
문제 설명:
음악 프로그램에서 특정 가수들의 순서를 정해야 합니다. 각 PD는 자신이 정한 순서대로 가수들을 정렬하고자 하며, 이를 기반으로 전체 순서를 출력합니다. 순서를 정할 수 없는 경우 0을 출력합니다.
문제 해결 코드
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int arr[1001];
int inDegree[1001];
vector<int>v[1001];
queue<int>q;
queue<int>result;
int main() {
int n, m;
cin >> n >> m;
int w;
for (int i = 0; i < m; i++) {
cin >> w;
for (int j = 0; j < w; j++) {
cin >> arr[j];
}
for (int j = 1; j < w; j++) {
v[arr[j - 1]].push_back(arr[j]);
inDegree[arr[j]]++;
}
}
for (int i = 1; i <= n; i++) {
if (inDegree[i] == 0) q.push(i);
}
for (int i = 1; i <= n; i++) {
if (q.empty()) {
cout << 0 << endl;
return 0;
}
int k = q.front();
q.pop();
result.push(k);
for (int j = 0; j < v[k].size(); j++) {
int next = v[k][j];
inDegree[next]--;
if (inDegree[next] == 0) q.push(next);
}
}
while (!result.empty()) {
int k = result.front();
result.pop();
cout << k << '\n';
}
}
예제
입력:
6 3
3 1 4 3
4 6 2 5 4
2 3 6
출력:
1
4
6
2
5
3
코드 설명
- 입력 처리:
- 각 PD가 제시한 순서를 입력받아 그래프의 간선과 진입 차수를 설정합니다.
- 위상 정렬:
- 진입 차수가 0인 노드를 큐에 넣고, 해당 노드에서 나가는 간선을 처리합니다.
- 큐가 비게 되면 순서를 정할 수 없는 경우이므로 0을 출력하고 종료합니다.
- 결과 출력:
- 큐에서 꺼낸 노드를 순서대로 출력하여 최종 정렬된 결과를 반환합니다.
시간 복잡도
- 간선의 처리: O(m)
- 위상 정렬: O(n + m)
- 총 시간 복잡도: O(n + m)
결과
위 코드는 입력된 조건에 따라 올바른 순서를 출력하며, 입력 조건에서 모순이 있거나 순서를 정할 수 없는 경우 0을 반환합니다.
728x90
LIST
'BAEKJOON > 그래프' 카테고리의 다른 글
백준 2887번 [행성 터널](C++) -yes6686- 티스토리 (0) | 2025.01.04 |
---|---|
백준 2252번 [줄 세우기](C++) -yes6686- 티스토리 (0) | 2025.01.04 |
백준 1647번 [도시 분할 계획](C++) -yes6686- 티스토리 (0) | 2025.01.04 |
백준 1154번 [팀 편성](C++) -yes6686- 티스토리 (0) | 2025.01.01 |
백준 1707번 [이분 그래프](C++) -yes6686- 티스토리 (0) | 2024.12.31 |