๋ฌธ์
https://leetcode.com/problems/find-eventual-safe-states/description/
๊ฐ ๋ ธ๋์ ๋ผ๋ฒจ์ด 0๋ถํฐ n-1๊น์ง ๋ถ์ด์๋ n๊ฐ์ ๋ ธ๋๋ก ์ด๋ฃจ์ด์ง ๋ฐฉํฅ ๊ทธ๋ํ๊ฐ ์๋ค. ๊ทธ๋ํ๋ 0-indexed ์ธ ์ด์ฐจ์ ์ ์ ๋ฐฐ์ด `graph`๋ก ํํ๋๊ณ , graph[i]๋ ๋ ธ๋ i์ ์ธ์ ํ ์ ์ ๋ฐฐ์ด์ด๋ค. ์ฆ, ๋ ธ๋ i๋ก๋ถํฐ grape[i]์ ์๋ ๋ ธ๋๋ค ๊ฐ์๋ ๊ฐ์ ์ด ์กด์ฌํ๋ค.
๋ง์ฝ ํ ๋ ธ๋์์ ๋๊ฐ๋ ๊ฐ์ ์ด ์๋ค๋ฉด ํด๋น ๋ ธ๋๋ terminal node์ด๋ค. ํ ๋ ธ๋๊ฐ safe node๋ผ๋ ๊ฒ์ ํด๋น ๋ ธ๋๋ก๋ถํฐ ์์ํ๋ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฒฝ๋ก๊ฐ terminal node ํน์ ๋ค๋ฅธ safe node๋ก ์ด์ด์ง๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ํ์ ๋ชจ๋ safe node๋ฅผ ํฌํจํ๋ ๋ฐฐ์ด์ ๋ฐํํ์ฌ๋ผ. ๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด์ผ ํ๋ค.
ํ์ด
DFS๋ฅผ ํ์ฉํ ๋ ธ๋ ํ์
fun eventualSafeNodes(graph: Array<IntArray>): List<Int> {
val n = graph.size
val result = mutableListOf<Int>()
val visited = BooleanArray(n)
val safe = BooleanArray(n)
for(i in 0 until n) {
if(dfs(i, visited, safe, graph)) {
result.add(i)
}
}
return result
}
private fun dfs(node: Int, visited: BooleanArray, safe:BooleanArray, graph: Array<IntArray>): Boolean {
if(visited[node]) return safe[node]
visited[node] = true
graph[node].forEach {i ->
if(!dfs(i, visited, safe, graph)) {
return false
}
}
safe[node] = true
return true
}
visited: ํด๋น ๋ ธ๋๋ฅผ ํ์ํ์๋์ง ์ฌ๋ถ
safe: ํด๋น ๋ ธ๋๊ฐ safe node์ธ์ง ์ฌ๋ถ
DFS method
- ํด๋น ๋ ธ๋๋ฅผ ์ด๋ฏธ ๋ฐฉ๋ฌธํ์๋ค๋ฉด ํด๋น ๋ ธ๋์ safe node ์ฌ๋ถ๋ฅผ ๋ฐํ
- graph[node]๋ฅผ ํ์ํ๋ฉด์ ์ฌ๊ท ํจ์ ์คํ
- ๋ฐฉ๋ฌธํ ๋ ธ๋ ์ค ํ๋๋ผ๋ safe node๊ฐ ์๋๋ผ๋ฉด, ํด๋น ๋ ธ๋๋ safe[node] = false ์ฒ๋ฆฌ
์๊ฐ ๋ณต์ก๋: O(n), ๊ณต๊ฐ ๋ณต์ก๋: O(n)
https://github.com/jeongum/algorithm/blob/master/LT_802_FindEventualSafeStates.kt
'๐ ์๊ณ ๋ฆฌ์ฆ > GraphTraversal' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 11967๋ฒ: ๋ถ์ผ๊ธฐ (JAVA) (0) | 2022.04.04 |
---|---|
[๋ฐฑ์ค] 14466๋ฒ: ์๊ฐ ๊ธธ์ ๊ฑด๋๊ฐ ์ด์ 6 (JAVA) (0) | 2022.03.28 |
[๋ฐฑ์ค] 3184๋ฒ ์ (Java) (0) | 2022.02.16 |
[๋ฐฑ์ค] 5427๋ฒ ๋ถ (Java) (0) | 2022.02.08 |
[๋ฐฑ์ค] 2606๋ฒ ๋ฐ์ด๋ฌ์ค (Java) (0) | 2021.08.24 |