LeetCode 210. Course Schedule 2
링크
제약조건
- 1 <= numCourses <= 2000
- 0 <= prerequisites.length <= numCourses * (numCourses - 1)
- prerequisites[i].length == 2
- 0 <= ai, bi < numCourses
- ai != bi
- All the pairs [ai, bi] are distinct.
풀이방법
- DFS
- numCourses 배열을 돌면서 선수과목과 그 이후에 들어야 하는 과목에 대한 정보를 dictionary에 list 형태로 저장한다. 단, 선수과목들을 순서대로 들어야 함으로 각 노드들의 상태를 색으로 구별해서 탐색하고, 깊이 우선 탐색이므로 최종 결과값을 [::-1] 해서 리턴해야 한다.
- BFS
- 순서대로 선수과목 출력하기 위해 indegree라는 정보를 별도로 저장하여 관리하고 그 순서대로 탐색을 한다.
코드
from typing import List
import collections
class Solution:
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
adj_list = collections.defaultdict(list)
indegree = {}
for dest, src in prerequisites:
adj_list[src].append(dest)
indegree[dest] = indegree.get(dest, 0) + 1
zero_indegree_queue = collections.deque([k for k in range(numCourses) if k not in indegree])
topological_sorted_order = []
while zero_indegree_queue:
v = zero_indegree_queue.popleft()
topological_sorted_order.append(v)
if v in adj_list:
for neighbor in adj_list[v]:
indegree[neighbor] -= 1
if indegree[neighbor] == 0:
zero_indegree_queue.append(neighbor)
return topological_sorted_order if len(topological_sorted_order) == numCourses else []
sol = Solution()
sol.findOrder(4, [[1,0],[2,0],[3,1],[3,2]])
시간복잡도
O(V+E): V가 vertices의 수, E가 엣지수 일때
공간복잡도
O(V+E)