[LeetCode] 207. Course Schedule

yunanยท2021๋…„ 2์›” 3์ผ
0
post-thumbnail

๐Ÿ”ฆ ๋ฌธ์ œ ๋งํฌ

๐Ÿ”Š ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธํ„ฐ๋ทฐ ์ฑ…์„ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฌธ์ œ

์ˆ˜๊ฐ•ํ•ด์•ผํ•˜๋Š” ์ด numCourses ๊ณผ์ •์ด ์žˆ์œผ๋ฉฐ, 0๋ถ€ํ„ฐ numCourses-1. ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. prerequisites [i] = [ai, bi]๋Š” ์ˆ˜๊ฐ•ํ•˜๋ ค๋ฉด ๋จผ์ € ๊ณผ์ • bi๋ฅผ ์ˆ˜๊ฐ•ํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋ชจ๋‘ ์ˆ˜๊ฐ•ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜์„ธ์š”.

โœ๏ธ ํ’€์ด


์–ด๋–ค ๊ณผ๋ชฉ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์„ ํ–‰๊ณผ๋ชฉ์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ๋‘๊ฐœ๊ฐ€ ์„œ๋กœ๊ฐ€ ์„œ๋กœ์˜ ์„ ํ–‰๊ณผ๋ชฉ ์ด๋ผ๋ฉด ์ˆœํ™˜์ด ์ƒ๊ฒจ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ฐฉ๋ฌธํ–ˆ๋˜ ๋…ธ๋“œ๋ฅผ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•œ๋ฒˆ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋Š” ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ˆœํ™˜์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์„ฑ๋Šฅ์„ ๋” ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฉ๋ฌธํ–ˆ๋˜ ๋…ธ๋“œ๋Š” True๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด ์ˆœํ™˜ ๊ฒ€์‚ฌ๋ฅผ ์ค‘๋ณต์œผ๋กœ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ์„ ๋”์šฑ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ์—์„œ traced๋Š” ํ˜„์žฌ๊นŒ์ง€ ๊ฑฐ์นœ ๊ณผ๋ชฉ๋“ค์ด ๋“ค์–ด์žˆ๊ณ  visited๋Š” ๋ฐฉ๋ฌธ ํ›„ ์ˆœํ™˜ ๊ฒ€์‚ฌ๊นŒ์ง€ ์™„๋ฃŒํ•œ ๋…ธ๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.
๋”ฐ๋ผ์„œ, traced์— ์ค‘๋ณต๋œ ๊ณผ๋ชฉ์ด ์žˆ์œผ๋ฉด ์ˆœํ™˜์œผ๋กœ False๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , visited์— ์ค‘๋ณต๋œ ๊ณผ๋ชฉ์ด ์žˆ์œผ๋ฉด ์ด๋ฏธ ๊ฒ€์‚ฌํ•ด์„œ ๊ตณ์ด ๊ฒ€์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•œ๋‹ค.

๐Ÿ›  ์ฝ”๋“œ


class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        # defaultdict ์ˆœํšŒ ๋ฌธ์ œ ์‹œ ์ „ํ˜€ ๊ฐ’์„ ๊ฑด๋“ค์ง€ ์•Š์•˜๋Š”๋ฐ ๊ฐ’์„ ๋ฐ”๊ฟจ๋‹ค๊ณ  ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
        # ๊ทธ ์ด์œ ๋Š” defaultdict๊ฐ€ ๋นˆ ๊ฐ’ ์กฐํšŒ์‹œ null๋ง๊ณ  ๋””ํดํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ๋‚˜๋Š” ์˜ค๋ฅ˜์ด๋‹ค.
        graph = collections.defaultdict(list)


        for x, y in prerequisites:
            graph[x].append(y)

        traced = set() # ์ค‘๋ณต ๋…ธ๋“œ๋ฅผ ๊ฒ€์‚ฌํ•ด์„œ ์‚ฌ์ดํด์„ ๊ฒ€์‚ฌํ•˜๋Š” ์ง‘ํ•ฉ
        visited = set() # ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ฆ‰, ์ด๋ฏธ ๊ฒ€์ฆ๋œ ๋…ธ๋“œ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์ง‘ํ•ฉ
        # visited๋กœ ๊ฐ€์ง€์น˜๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ ธ ์†๋„์˜ ์—„์ฒญ๋‚œ ํ–ฅ์ƒ์„ ๊ฐ€์ ธ์˜ด.

        def dfs(i):
            if i in traced:
                return False
            if i in visited:
                return True

            traced.add(i)

            for y in graph[i]: # ๋นˆ ๊ฐ’ ์กฐํšŒ์‹œ ๋นˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ธด ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด๋‹ค.
                if not dfs(y):
                    return False
            traced.remove(i)

            visited.add(i)
            return True

        for x in list(graph):
            print(x)
            if not dfs(x):
                return False

        return True


๐Ÿ“ ์ •๋ฆฌ


๐ŸŽˆ ์ฐธ๊ณ 


Book ๋งํฌ

profile
Go Go

0๊ฐœ์˜ ๋Œ“๊ธ€