Algorithm/LeetCode

[LeetCode] 802. Find Eventual Safe States (ํŒŒ์ด์ฌ/python)

chjcoder 2023. 8. 7. 20:40

๐ŸŽˆ๋ฌธ์ œ

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ํ•œ๋‹ค.