November 27, 2025
์ด ๋ฌธ์ ์์๋ numCourses๊ฐ์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๊ณ , ๊ฐ ๊ฐ์์ ์ ์๊ณผ๋ชฉ์ด ์ฃผ์ด์ง ๋ ๋ชจ๋ ๊ฐ์๋ฅผ ์๊ฐํ ์ ์๋ ์์๋ฅผ ๋ฐํํฉ๋๋ค.
๋ฑ ๋ณด๋๊น ์ด์ ์ ๊ทธ๋ํ ๋ฌธ์ ์ธ์ง ์ ๊ฒ ๊ฐ๋ค. ๋ญ๊ฐ ๋ ธ๋๊ฐ ์กด์ฌํ๊ณ ๊ฐ์ ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ์ ๋ํด์, path๋ฅผ ์ฐพ์ ์ ์๋ ์ ํ์ ๋ฌธ์ ๋ฉด ๋ณดํต backtracking, DFS, ๋ฑ์ผ๋ก ์ ๊ทผํด๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค.
class Solution:
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
# 1) create graph
graph = defaultdict(list)
for course,prereq in prerequisites:
graph[prereq].append(course)
visited = [0] * numCourses
order = []
# 2) DFS backtracking
def dfs(course):
if visited[course] == 1:
return False
if visited[course] == 2:
return True
visited[course] = 1
for neighbor in graph[course]:
if not dfs(neighbor):
return False
visited[course] = 2
order.append(course)
return True
# 3) find path
for course in range(numCourses):
if visited[course] == 0:
if not dfs(course):
return []
return order[::-1]
Constraints:
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.