< All posts

207. Course Schedule

๋ฌธ์ œ ์„ค๋ช…

์ด ๋ฌธ์ œ์—์„œ๋Š” numCourses๊ฐœ์˜ ๊ฐ•์˜๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ๊ฐ ๊ฐ•์˜์˜ ์„ ์ˆ˜๊ณผ๋ชฉ์ด ์ฃผ์–ด์งˆ ๋•Œ ๋ชจ๋“  ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

207

ํ’€์ด ๋ฐ ํ•ด์„ค

๋”ฑ ๋ณด๋‹ˆ๊นŒ ์ด์ œ ์™œ ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ์ธ์ง€ ์•Œ ๊ฒƒ ๊ฐ™๋‹ค. ๋ญ”๊ฐ€ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๊ณ  ๊ฐ„์„ ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ, path๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์œ ํ˜•์˜ ๋ฌธ์ œ๋ฉด ๋ณดํ†ต backtracking, DFS, ๋“ฑ์œผ๋กœ ์ ‘๊ทผํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

    1. ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ
    • ์„ ์ˆ˜๊ณผ๋ชฉ์„ ๊ฐ„์„ ์œผ๋กœ, ๊ฐ•์˜๋ฅผ ๋…ธ๋“œ๋กœ ํ•˜๋Š” ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    1. DFS ๋ฐฑํŠธ๋ž˜ํ‚น ๊ตฌํ˜„
    • set์„ ๋‘๊ฐœ ์‚ฌ์šฉํ•œ๋‹ค: visited, recursion_stack
      • visited: ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋“ค์„ ์ €์žฅ
      • recursion_stack: ํ˜„์žฌ ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ ์ €์žฅ
    1. ๊ทธ๋ž˜ํ”„์—์„œ ์ˆœํ™˜ ๋ฃจํ”„๋‚˜ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธ
    • ๊ฐ ๊ฐ•์˜์— ๋Œ€ํ•ด DFS๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ˆœํ™˜ ๋ฃจํ”„๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • ๋งŒ์•ฝ ์ˆœํ™˜ ๋ฃจํ”„๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด False๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋ชจ๋“  ๊ฐ•์˜๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉด True๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ํ’€์ด

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

Complexity Analysis

c

์‹œ๊ฐ„ ๋ณต์žก๋„

  • ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ: O(P) (P๋Š” ์„ ์ˆ˜๊ณผ๋ชฉ์˜ ์ˆ˜)
  • DFS ํƒ์ƒ‰: O(V + E) (V๋Š” ๊ฐ•์˜ ์ˆ˜, E๋Š” ๊ฐ„์„  ์ˆ˜)
  • ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„: O(P + V + E)

๊ณต๊ฐ„ ๋ณต์žก๋„

  • ๊ทธ๋ž˜ํ”„ ์ €์žฅ: O(V + E)
  • ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ: O(V)
  • ์ „์ฒด ๊ณต๊ฐ„ ๋ณต์žก๋„: O(V + E)

Constraint Analysis

Constraints:
1 <= numCourses <= 2000
0 <= prerequisites.length <= 5000
prerequisites[i].length == 2
0 <= ai, bi < numCourses
All the pairs prerequisites[i] are unique.

References

ยฉ 2025 HyunJoon Sung. All Rights Reserved.

GitHub