November 25, 2025
์ด ๋ฌธ์ ์์๋ numCourses๊ฐ์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๊ณ , ๊ฐ ๊ฐ์์ ์ ์๊ณผ๋ชฉ์ด ์ฃผ์ด์ง ๋ ๋ชจ๋ ๊ฐ์๋ฅผ ์๊ฐํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ฐํํฉ๋๋ค.
๋ฑ ๋ณด๋๊น ์ด์ ์ ๊ทธ๋ํ ๋ฌธ์ ์ธ์ง ์ ๊ฒ ๊ฐ๋ค. ๋ญ๊ฐ ๋ ธ๋๊ฐ ์กด์ฌํ๊ณ ๊ฐ์ ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ์ ๋ํด์, path๋ฅผ ์ฐพ์ ์ ์๋ ์ ํ์ ๋ฌธ์ ๋ฉด ๋ณดํต backtracking, DFS, ๋ฑ์ผ๋ก ์ ๊ทผํด๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค.
class Solution:
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
# 1) create graph
graph = defaultdict(list)
for prereq,course in prerequisites:
graph[prereq].append(course)
visited = set()
recursion_stack = set()
# 2) implement DFS backtracking
def dfs(course):
if course in recursion_stack:
return False
if course in visited:
return True
recursion_stack.add(course)
for neighbor in graph[course]:
if not dfs(neighbor):
return False
recursion_stack.remove(course)
visited.add(course)
return True
# 3) check if any circular loops or path DNE exist in graph
for course in range(numCourses):
if not dfs(course):
return False
return True
Constraints:
1 <= numCourses <= 2000
0 <= prerequisites.length <= 5000
prerequisites[i].length == 2
0 <= ai, bi < numCourses
All the pairs prerequisites[i] are unique.