๐
ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ ์ธํฐ๋ทฐ
์ฑ ์ ์ฐธ๊ณ ํ์ต๋๋ค.
์๊ฐํด์ผํ๋ ์ด 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