PS/백준

[BOJ] 2252 줄 세우기

uyt8989 2022. 1. 10. 13:19

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

문제

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

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

입력

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

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

3 2
1 3
2 3

출력

첫째 줄에 학생들을 키 순서대로 줄을 세운 결과를 출력한다. 답이 여러 가지인 경우에는 아무거나 출력한다.

1 2 3

 

네달간 틀렸습니다 상태로 방치되어 있던 문제를 드디어 풀었다.

블로그를 쓰면서 위상 정렬 문제도 언젠가 풀어야지 했었는데 겸사겸사 해결했다.

 

위상 정렬 문제를 풀어본 적이 없다보니 어떤 식으로 접근해야할지 모르겠어서

다른 블로그를 참고해서 문제를 풀었다.

근데 정답 코드를 보니까 뭔가 익숙한 느낌이 들었다. 이 문제도 학기 중에 배웠던 것 같다.

DAG라는걸 배우면서 카운트가 0이 되는 노드를 불라불라 이런 식으로 슥 지나갔던 것 같은데 걔가 얘였다.

 

counter라는 배열을 만들어서 각 노드보다 먼저 와야하는 노드의 개수를 저장했다.

이 배열의 값이 0이 되면 이제는 먼저 와야하는 노드가 없으므로 출력해도 무방하다.

그리고 그 노드보다 뒤에 와야하는 노드들의 counter 값을 1 감소시켜준다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

#define MAX 32001

int N, M;
vector<int> order[MAX];
int counter[MAX];
queue<int> Q;

int main() {
	scanf("%d %d", &N, &M);

	int A, B;
	for (int i = 0; i < M; i++) {
		scanf("%d %d", &A, &B);
		order[A].push_back(B);
		counter[B]++;
	}

	for (int i = 1; i <= N; i++)
		if (counter[i] == 0) Q.push(i);

	int cur;
	while (!Q.empty()) {
		cur = Q.front();
		Q.pop();

		printf("%d ", cur);

		for (int i = 0; i < order[cur].size(); i++) {
			if (--counter[order[cur][i]] == 0)
				Q.push(order[cur][i]);
		}
	}

	return 0;
}

 

후기)

도움 없이 문제를 뚝딱뚝딱 풀진 못하지만 그래도 얼핏얼핏 아는 개념이 등장해서 반갑다.

C++에 조금 더 익숙해지면 훨씬 편할 것 같다.

이번 코드만 해도 큐랑 벡터를 사용해서 자료구조를 쉽게 짰다.

'PS > 백준' 카테고리의 다른 글

[BOJ] 12015 가장 긴 증가하는 부분 수열 2  (0) 2022.01.12
[BOJ] 1005 ACM Craft  (0) 2022.01.11
[BOJ] 1949 우수 마을  (2) 2022.01.09
[BOJ] 2533 사회망 서비스(SNS)  (0) 2022.01.09
[BOJ] 1562 계단 수  (1) 2022.01.08