[LeetCode] 802. Find Eventual Safe States (ํ์ด์ฌ/python)
๐๋ฌธ์
https://leetcode.com/problems/find-eventual-safe-states/description/
๐์ด๋ค ์๊ณ ๋ฆฌ์ฆ?
1. ๊ฐ node๊ฐ terminal node๋ก ๋๋๋์ง ์ํํ๋์ง๋ฅผ ํ์ธํด์ผ ํ๋ฏ๋ก DFS๋ฅผ ์ด์ฉํ๋ค.
๐ป์ฝ๋
class Solution(object):
def eventualSafeNodes(self, graph):
# 2. dfs๋ฅผ ์ด์ฉํด ๋๊น์ง ํ๊ณ ๊ฐ์ ํด๋น ๋
ธ๋๊ฐ safe node์ธ์ง ํ๋ณ
def dfs(i):
if i in safe:
return safe[i]
safe[i] = False
for neighbor in graph[i]:
if not dfs(neighbor):
return False
safe[i] = True
return True
n = len(graph)
safe = {}
safe_nodes = []
# 1. ๊ฐ ๋
ธ๋๋ณ ํ์
for i in range(n):
if dfs(i):
safe_nodes.append(i)
return safe_nodes
๐์ฝ๋ ์ค๋ช
safe๋ผ๋ ๋์ ๋๋ฆฌ์ ๊ฐ node๋ณ๋ก safe node์ธ์ง, safe node๊ฐ ์๋์ง๋ฅผ {0: False, 1: False , ... } ์ ํํ๋ก ์ ์ฅํ๋ค.
1. ๊ฐ ๋ ธ๋๋ณ๋ก ํ๋ฒ์ฉ ํ์ํ๋๋ฐ, ํด๋น ๋ ธ๋๋ฅผ dfs๋ฅผ ํตํด ๋งจ ๋ค๋ฅผ ํ์ธํ ํ safe node์ด๋ฉด ๋ฆฌ์คํธ safe_nodes์ ์ถ๊ฐํ๋ค.
2. dfs๋ฅผ ํตํด ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ํ๊ณ ๋ค์ด๊ฐ๋ฉฐ ํ์ธํ๋๋ฐ, safe๋ผ๋ ๋์ ๋๋ฆฌ์ ๊ธฐ๋กํด ๋๋ ์ด์ ๋ ์ด์ ์ ํ์ํ์๋ ๋ ธ๋๋ค์ ์ค๋ณต์ผ๋ก ํ์ํ๊ฒ๋๋ฉด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ค์ ์ด๋ค. ๋ฐ๋ผ์ ์ด๋ฏธ ํ์ํ node๋ ๊ฑด๋ ๋ฐ๊ธฐ ์ํด safe์ ๊ธฐ๋กํด ๋๋ค.
3. ๋ ธ๋๋ฅผ ์ฒ์ ๋ง๋๊ฒ ๋ ๊ฒฝ์ฐ(safe ๋์ ๋๋ฆฌ์ ์ ์ฅ๋์ง ์์ ๊ฒฝ์ฐ) ์ฐ์ ์ ์ผ๋ก False๋ก ๊ธฐ๋ก๋๋๋ฐ, ๊ทธ ์ด์ ๋ dfs๋ฅผ ์ด์ฉํด ๋ ธ๋๊ฐ ์ด์ด์ง ๋งจ ๋๊น์ง ํ์ธํ ๋, ํด๋น ๋ ธ๋๊ฐ terminal node๋ก ๋๋์ง ์๊ณ ์ํ์ผ๋ก ์ด์ด์ง๋ฉด ์ฌ๊ท๋ฅผ ํ์ถํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ผ๋จ์ False๋ก ๊ธฐ๋กํด ๋ ํ, ๋ค์ ๋ง๋๊ฒ ๋๋ฉด ํ์ถํ ์ ์๋๋ก ํ๋ค.
4. 0 ์ ๊ฒฝ์ฐ 0->1->2->5 ์ 0->1->3->0 ๋ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ๋จผ์ 0->1->2->5์ ๊ฒฝ์ฐ๋ฅผ ๋ง๋๊ฒ ๋๋ค. ์ด๋, terminal node์ธ 5๋ก ์ ๋ง๋ฌด๋ฆฌ ๋๋ฏ๋ก dictionary์ {0:False, 1:False, 2:False, 5:True} ๊ฐ ์ ์ฅ๋๊ณ , dfs(5)๋ฅผ ํ์ถ ํ dfs(2)์์ {0:False, 1:False, 2:True, 5:True}๊ฐ ์ ์ฅ๋๋ค. ๊ทธ ํ, dfs(1)๋ก ๋์์์ dfs(3)์ ํ์ํ๊ฒ ๋๋๋ฐ, ์ด๋ dfs(0)์ ๋ฐฉ๋ฌธํ ๊ธฐ๋ก์ด False๋ก ์์ผ๋ฏ๋ก False๋ฅผ return ํ๋ค. ๊ทธ๋ฌ๋ฉด ์ต์ข ์ ์ผ๋ก dictionary์ {0:False, 1:False, 2:True, 5:True, 3:False}๊ฐ ๊ธฐ๋ก๋๋ค.
5. ๋ ธ๋๊ฐ False๋ก ์ ์ฅ๋์ด ์๋ ๊ฒฝ์ฐ, False๋ฅผ ๋ฐํํ๊ณ , safe_nodes์ ์ถ๊ฐ๋์ง ์๋๋ค.
6. ๋ ธ๋๊ฐ True๋ก ์ ์ฅ๋์ด ์๋ ๊ฒฝ์ฐ, True๋ฅผ ๋ฐํํ๊ณ , safe_nodes์ appendํ๋ค.