๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/GraphTraversal

[LeetCode] 802. Find Eventual Safe States (ํ•ด์„, kotlin ํ’€์ด)

์ ์ด 2023. 7. 12. 22:01
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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

๋ฐ˜์‘ํ˜•