일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- CS
- 알고리즘
- 리트코드
- frontend
- DFS
- db
- Javascript
- 자바
- BFS
- Database
- git
- 다이나믹 프로그래밍
- Graph
- react
- Python
- java
- 프로그래머스
- Algorithm
- 그레이들
- vscode
- VIM
- 백준
- Data Structure
- LeetCode
- TypeScript
- 동적 계획법
- Redux
- network
- DP
- 안드로이드
Archives
- Today
- Total
늘 겸손하게
백준 - 14567번: 선수과목 (Prerequisite) 본문
선수과목 (Prerequisite)
문제 유형 : DP, 위상정렬
난이도 : 골드 5
https://www.acmicpc.net/problem/14567
문제 풀이
위상정렬 알고리즘을 조금 응용한다.
큐 내부에 요소 하나를 빼내어 탐색하고 다음 탐색할 요소들을 큐에 다시 넣는 방법 대신,
큐에 존재하는 요소를 전부 빼내어 탐색하는 것을 하나의 loop으로 보고 모든 요소를 탐색할때까지 반복한다.
코드
import sys
from collections import deque
input = sys.stdin.readline
N, M = map(int, input().split())
graph = [[] for _ in range(N + 1)]
degree = [0] * (N + 1)
for _ in range(M):
a, b = map(int, input().split())
graph[a].append(b)
degree[b] += 1
queue = deque()
result = [0] * (N + 1)
for i in range(1, N + 1):
if degree[i] == 0:
queue.append(i)
loop = 1
while queue:
for i in queue:
result[i] = loop
size = len(queue)
for _ in range(size):
i = queue.popleft()
for j in graph[i]:
degree[j] -= 1
if degree[j] == 0:
queue.append(j)
loop += 1
result.pop(0)
print(*result)
마무리
'코딩 문제 > 백준' 카테고리의 다른 글
백준 - 16562번: 친구비 (Python, 분리 집합) (2) | 2023.10.14 |
---|---|
백준 - 15659번: 연산자 끼워넣기 (3) (0) | 2023.09.19 |
백준 - 16929번: Two Dots (Python) (0) | 2023.09.12 |
백준 - 11067번: 모노톤길 (Python) (0) | 2023.09.11 |
백준 1890 점프 (Java) (0) | 2023.08.04 |