|
| 1 | +''' |
| 2 | +μκ° λ³΅μ‘λ: O(V + E) |
| 3 | +- μμ μ λ ¬(Topological Sort)μ μ¬μ©νμ¬ λͺ¨λ λ
Έλ(κ³Όλͺ©)μ κ°μ (μ μ κ³Όλͺ© κ΄κ³)μ νμνλ―λ‘ O(V + E)μ
λλ€. |
| 4 | + - V: λ
Έλ(κ³Όλͺ©) κ°μ (numCourses) |
| 5 | + - E: κ°μ (μ μ κ³Όλͺ© κ΄κ³) κ°μ (prerequisitesμ κΈΈμ΄) |
| 6 | +
|
| 7 | +κ³΅κ° λ³΅μ‘λ: O(V + E) |
| 8 | +- κ·Έλνλ₯Ό μΈμ 리μ€νΈλ‘ μ μ₯νλ λ° O(V + E) 곡κ°μ΄ νμν©λλ€. |
| 9 | +- μΆκ°μ μΌλ‘ λ°©λ¬Έ μνλ₯Ό μ μ₯νλ 리μ€νΈκ° νμνμ¬ O(V). |
| 10 | +- λ°λΌμ μ΄ κ³΅κ° λ³΅μ‘λλ O(V + E)μ
λλ€. |
| 11 | +''' |
| 12 | + |
| 13 | +from collections import deque |
| 14 | +from typing import List |
| 15 | + |
| 16 | +class Solution: |
| 17 | + def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool: |
| 18 | + # κ·Έλν μ΄κΈ°ν |
| 19 | + graph = {i: [] for i in range(numCourses)} |
| 20 | + in_degree = {i: 0 for i in range(numCourses)} |
| 21 | + |
| 22 | + # μ μ κ³Όλͺ© μ 보 κ·Έλνμ μ μ₯ |
| 23 | + for course, pre in prerequisites: |
| 24 | + graph[pre].append(course) |
| 25 | + in_degree[course] += 1 |
| 26 | + |
| 27 | + # μ§μ
μ°¨μκ° 0μΈ κ³Όλͺ©(μ μ κ³Όλͺ©μ΄ μλ κ³Όλͺ©)μ νμ μΆκ° |
| 28 | + queue = deque([course for course in in_degree if in_degree[course] == 0]) |
| 29 | + completed_courses = 0 |
| 30 | + |
| 31 | + while queue: |
| 32 | + current = queue.popleft() |
| 33 | + completed_courses += 1 |
| 34 | + |
| 35 | + for neighbor in graph[current]: |
| 36 | + in_degree[neighbor] -= 1 |
| 37 | + if in_degree[neighbor] == 0: |
| 38 | + queue.append(neighbor) |
| 39 | + |
| 40 | + # λͺ¨λ κ³Όλͺ©μ μκ°ν μ μλ€λ©΄ True, μλλ©΄ False |
| 41 | + return completed_courses == numCourses |
0 commit comments