파이썬/백준
[백준 2252번 | 골드3] Python 풀이
Mujae98
2024. 1. 8. 00:55
문제를 보면 1 3, 3 2 이런식으로 두 개의 숫자를 주는데 왼쪽의 수가 오른쪽의 수보다 앞에 있어야 한다는 조건이 있다.
여기 이 문제가 위상정렬 문제임을 알 수 있다. (여러 가지 일이 있는데 이들 상호 간에 상호 선후 관계가 있을 때 위상정렬을 사용한다.)
위상정렬에서는 크게 두 가지 방법이 있다고 한다.
1. 진입 간선이 없는 정점을 선택하고 해당 정점과 연결되어 있는 정점 방문을 반복하면서 진출 간선을 하나씩 없애는 방법.
2. DFS(+백트래킹)
나는 2번 방식으로 풀어보았다. (시간나면 1번으로도 풀어서 수정하겠습니다.)
from collections import deque
import sys
input = sys.stdin.readline
def dfs(v):
visited[v]=1
for j in li[v]:
if visited[j]==0:
dfs(j)
TS.appendleft(v)
return
n, m = map(int, input().split())
#4 2 이런식으로 입력되면 4가 2보다 앞에 있으니 4에서 2로 간다고 생각
li = [[] for _ in range(n+1)]# Graph
for i in range(m):
a, b = map(int, input().split())
li[a].append(b)
visited = [0]*(n+1)# 방문기록을 위한 리스트
TS = deque()# TopologicalSort 결과를 저장할 덱 -> 백트래킹을 활용하기 때문에 dfs 특성상 끝까지 들어가서 정점이 저장되는 것을 역으로 생각해 appendleft로 순서유지
for i in range(1,n+1):
if visited[i]==0:
dfs(i)
print(*TS)
DFS로 주욱 들어갔다가 끝을 보면 돌아오면서 하나씩 저장(왼쪽으로)하는 것 밖에 없음.