Notice
Recent Posts
Recent Comments
Link
250x250
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
Tags
- BFS
- 에라토스테네스
- 딕셔너리
- 에라토스테네스의 체
- 외적
- dijkstra algorithm
- 큐
- 비트마스킹
- Two Pointers
- recursion
- binary search
- Python
- 이진 탐색
- 소수
- 알고리즘
- 비트연산
- BOJ
- Bitmasking
- DP
- deque
- Algorithm
- 재귀
- ccw
- 투 포인터
- 너비우선탐색
- CCW알고리즘
- 다익스트라
- 위상정렬
- CCW 알고리즘
- 백준
Archives
- Today
- Total
꾸꾸리
[BOJ/Python] 2252_줄 세우기 본문
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
문제
N명의 학생들을 키 순서대로 줄을 세우려고 한다. 각 학생의 키를 직접 재서 정렬하면 간단하겠지만, 마땅한 방법이 없어서 두 학생의 키를 비교하는 방법을 사용하기로 하였다. 그나마도 모든 학생들을 다 비교해 본 것이 아니고, 일부 학생들의 키만을 비교해 보았다.
일부 학생들의 키를 비교한 결과가 주어졌을 때, 줄을 세우는 프로그램을 작성하시오.
입력
첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의미이다.
학생들의 번호는 1번부터 N번이다.
출력
첫째 줄에 학생들을 앞에서부터 줄을 세운 결과를 출력한다. 답이 여러 가지인 경우에는 아무거나 출력한다.
예제 입력 1
3 2
1 3
2 3
예제 출력 1
1 2 3
예제 입력 2
4 2
4 2
3 1
예제 출력 2
4 2 3 1
풀이
위상정렬을 이용하게 되면 학생 A가 학생 B 앞에 선 줄 세우기를 수행할 수 있다.
코드는 다음과 같다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import sys
import collections
def topological_sort():
result = []
queue = collections.deque()
for i in range(1,n+1):
if indegree[i]==0:
queue.append(i)
while queue:
node = queue.popleft()
result.append(node)
for next in graph[node]:
indegree[next]-=1
if indegree[next]==0:
queue.append(next)
return result
n,m = map(int,sys.stdin.readline().split())
indegree = [0 for _ in range(n+1)]
graph = [[] for _ in range(n+1)]
for _ in range(m):
a,b = map(int,sys.stdin.readline().split())
graph[a].append(b)
indegree[b]+=1
result = topological_sort()
print(*result)
|
cs |
- A가 B 앞에 선다는 것은 A다음으로 B가 나와야 함을 의미한다.
- 따라서 학생A -> 학생 B로 연결됨을 그래프로 표시하고, 학생 B는 현재 자신으로 들어오는 간선이 하나 추가되었으므로 indegree를 1 증가시킨다.
- 위상정렬을 수행하게되면, 우선 indegree가 0인 노드들을 큐에 추가한다. (0이라는 것은 다른 학생 뒤에 설 필요가 없는 학생임을 의미한다.)
- 해당 학생들을 하나씩 큐에서 뽑아내고 result리스트에 추가한다. (result리스트는 최종적으로 출력할 결과이다.)
- 뽑은 학생 뒤에 서야 하는 학생이 존재하는지 확인하고 존재한다면 indegree를 1 감소시킨다.
- 만약 indegree가 0이 된다면, 이제 해당 학생은 더 이상 남아있는 학생 중 누군가의 뒤에 설 필요 없으므로 큐에 넣어준다.
- 최종적으로 result를 출력한다.
728x90
'Algorithm > BOJ' 카테고리의 다른 글
| [BOJ/Python] 1197_최소 스패닝 트리 (0) | 2023.03.03 |
|---|---|
| [BOJ/Python] 1613_역사 (0) | 2023.03.02 |
| [BOJ/Python] 1719_택배 (0) | 2023.02.28 |
| [BOJ/Python] 1963_소수 경로 (1) | 2023.02.27 |
| [BOJ/Python] 11403_경로 찾기 (0) | 2023.02.26 |