취미가 좋다

210. Course Schedule II 본문

알고리즘 문제풀이/Leetcode

210. Course Schedule II

benlee73 2021. 8. 31. 10:54

https://leetcode.com/problems/course-schedule-ii/

 

Course Schedule II - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

Solution

class Solution:
    def __init__(self):
        self.ans = []
        self.graph = defaultdict(set)
        self.visit = None

    def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:        
        for i, j in prerequisites:
            self.graph[i].add(j)
        self.visit = [0] * numCourses

        for i in range(numCourses):
            if not self.dfs(i):
                return []
        return self.ans
    
    def dfs(self, i):
        if self.visit[i] == 1:
            return True
        elif self.visit[i] == -1:
            return False
        
        self.visit[i] = -1
        
        for k in self.graph[i]:
        	if not self.dfs(k):
        		return False
        
        self.visit[i] = 1
        self.ans.append(i)
        return True
  • graph를 defaultdict(set)으로 선언한다.
  • visit을 만들 때, [0,0...0]을 for문 돌리지 말고 위의 연산을 사용한다.
  • 각 노드를 돌면서 하위 노드로 내려간다.
  • 하위 노드를 내려가다가 이전에 지나쳤던 노드가 나오면 False를 반환한다.
  • 가장 먼저 visit = 1이 되는 노드부터 수강하면 되므로, ans에 순서대로 추가한다.
  • visit 1로 표시되면 그 아래로 다 괜찮다는 뜻이므로 더 검사하지 않는다.

defaultdict

from collections import defaultdict

 

사전에 없는 키를 찾거나 접근하면 에러가 발생한다.

defaultdict를 사용하면 없는 키라도 default로 설정한 타입의 value를 갖게 된다.

즉, 사전에 키가 있는지 검사하는 과정을 생략할 수 있다.

인자로는 int, list, set 등이 올 수 있다.

from collections import defaultdict

d = defaultdict(int)
print(d['0'])   # 0
print(d)        # {'0':0}

'알고리즘 문제풀이 > Leetcode' 카테고리의 다른 글

221. Maximal Square  (0) 2021.09.06
215. Kth Largest Element in an Array  (0) 2021.09.03
208. Implement Trie (Prefix Tree)  (0) 2021.08.30
207. Course Schedule  (0) 2021.08.24
200. Number of Islands  (0) 2021.08.20
Comments