m1ndy5's coding blog

LeetCode 207. Course Schedule with Python 본문

알고리즘 with python/알고리즘 스터디

LeetCode 207. Course Schedule with Python

정민됴 2024. 1. 11. 09:03

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

풀지 못했던 문제ㅠㅠ
책 코드를 보고 풀었다!

import collections

class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        # value가 list형태인 dictionary 선언
        graph = collections.defaultdict(list)
        for x, y in prerequisites:
            graph[x].append(y)

        # 추적하고 있는 코스
        traced = set()
        # 수강한 코스
        visited = set()

        def dfs(i):
            # 이미 추적했다면 -> 순회 체크
            if i in traced:
                return False
            # 이미 수강한 코스라면 True
            if i in visited:
                return True

            # 추적리스트에 추가
            traced.add(i)
            # 선수과목들 체크
            for y in graph[i]:
                # 선수과목들의 선수과목들 재귀 -> traced에서 False가 리턴되면 최종결과도 False
                if not dfs(y):
                    return False

            # for문이 무사히 종료되면 traced에서 빼고 수강된 코스로 변경
            traced.remove(i)
            visited.add(i)

            return True

        # graph의 키값만 확인 -> 어짜피 선수과목 없는 코스는 무조건 들을 수 있음
        for x in list(graph):
            if not dfs(x):
                return False

        return True

내가 아직 재귀함수의 리턴값이 있을 경우의 코드를 잘 짜지 못하는 것 같다.
문제를 많이 풀어보면서 익혀야겠다!