๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“’ | Kotlin/๐Ÿค– | ์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜(DFS, BFS)

by immgga 2024. 6. 22.

์ถœ์ฒ˜: unsplash.com

 

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์ด๋ž€?

๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋“ค ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์„ ํƒ์ƒ‰์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ,
๊ทธ๋ž˜ํ”„์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์„ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์ด๋ผ ๋ถ€๋ฅธ๋‹ค.

 

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” DFS, BFS๊ฐ€ ์žˆ๋‹ค.
DFS(Depth-First Search): ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰
BFS(Breadth-First Search): ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰

 

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS)

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ทธ๋ž˜ํ”„์˜ ์ž์‹ ๋ฐ์ดํ„ฐ์— ๋“ค์–ด๊ฐ„ ํ›„, ์ž์‹์˜ ์ž์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์‹์˜ ์ž์‹์˜ ์ž์‹ ๋ฐ์ดํ„ฐ๋ฅผ ๋“ค์–ด๊ฐ€๋Š” ์‹์œผ๋กœ, ํ•œ ๊ฐ€์ง€๋ฅผ ๋๊นŒ์ง€ ํŒŒ๊ณ  ๋“ค์–ด๊ฐ€์„œ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋œปํ•œ๋‹ค.

์ถœ์ฒ˜: https://jin1ib.tistory.com/entry/BFS-DFS-1

 

ํ•œ ์ค„๊ธฐ๋ฅผ ๋๊นŒ์ง€ ํŒŒ๊ณ ๋“  ํ›„, ๋‹ค์Œ ์ค„๊ธฐ๋กœ ์ด๋™ํ•ด ๋‹ค์‹œ ๋๊นŒ์ง€ ํŒŒ๊ณ ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

 

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS)

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์€ ์‹œ์ž‘ ๋ฐ์ดํ„ฐ์—์„œ ์ž์‹ ์˜ ์ž์‹ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜๊ณ  ๊ทธ๋‹ค์Œ ์ž์‹์˜ ์ž์‹ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ชจ๋‘ ํ™•์ธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

์ถœ์ฒ˜: https://jin1ib.tistory.com/entry/BFS-DFS-1

 

1์ธต๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด 2์ธต์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜๊ณ , ๊ทธ๋‹ค์Œ 3์ธต์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

 

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋Œ€์ฒด๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์“ด๋‹ค.

DFS์—๋Š” Stack์„,
BFS์—๋Š” Queue๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

์Šคํƒ์„ ์ด์šฉํ•œ DFS ๊ตฌํ˜„ ๋ฐฉ๋ฒ•(์ด๋ก )

์ดˆ๊ธฐ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ์„ ๋•Œ,

 

์‹œ์ž‘์ ์œผ๋กœ ์ง€์ •ํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„ ๋จผ์ € Stack์— ๋„ฃ์–ด ์ค€๋‹ค.

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

Stack์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋นผ๋‚ธ๋‹ค.
๋นผ๋‚ธ ๋ฐ์ดํ„ฐ์™€ ์—ฐ๊ด€๋˜์–ด ์žˆ๋Š” child ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ž˜ํ”„์—์„œ ์ฐพ์€ ํ›„ ์Šคํƒ์— ๋„ฃ์–ด ์ค€๋‹ค(0์˜ child ๋ฐ์ดํ„ฐ๋Š” 1์ด ๋œ๋‹ค).
์—ฐ๊ด€ child ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜, ์ด๋ฏธ ํ•œ ๋ฒˆ ์Šคํƒ์— ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ์Šคํƒ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋นผ๋‚ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ฃผ์˜ํ•  ์ ์€ ํ•œ ๋ฒˆ ์Šคํƒ์— ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์‹œ ์Šคํƒ์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์œ„ 3๊ฐ€์ง€์˜ ๊ณผ์ •์„ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด DFS ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ด๋‹ค.

 

DFS๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ†ตํ•ด ๋” ์‰ฝ๊ฒŒ ๊ทธ๋ž˜ํ”„๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

ํ๋ฅผ ์ด์šฉํ•œ BFS ๊ตฌํ˜„(์ด๋ก )

์ดˆ๊ธฐ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ์„ ๋•Œ,

 

DFS์™€ ๊ฐ™์ด ์ดˆ๊ธฐ์— ์‹œ์ž‘ํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ํ์— ๋„ฃ๊ณ  ์‹œ์ž‘ํ•œ๋‹ค.

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

ํ์—์„œ ์ œ์ผ ๋จผ์ € ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋นผ์ค€๋‹ค.
๋นผ๋‚ธ ๋ฐ์ดํ„ฐ์˜ ์ž์‹ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ชจ๋‘ ํ์— ๋„ฃ์–ด์ค€๋‹ค(๋ฐ์ดํ„ฐ 2์˜ ์ž์‹ ๋ฐ์ดํ„ฐ๋Š” 1, 3, 4์ด๋‹ค).
๋นผ๋‚ผ ์ž์‹ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜, ์ด๋ฏธ ํ•œ ๋ฒˆ ํ์— ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ํ์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.
๋นผ๋‚ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

DFS์™€ ๋˜‘๊ฐ™์ด ํ์— ํ•œ ๋ฒˆ ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์‹œ ํ์— ๋„ฃ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

 

์œ„์˜ ์˜ˆ์‹œ๋Š” ์ถœ๋ฐœ์ ์„ 0์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์‹œ์ž‘ํ–ˆ์ง€๋งŒ, ๊ผญ 0๊ณผ ๊ฐ™์€ ๋์ž๋ฝ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ์–ด๋„ ๋œ๋‹ค.
3๊ณผ 5 ๊ฐ™์€ ์ค‘์•™์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ์žก์•„๋„ DFS์™€ BFS๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

๋ฐฑ์ค€์˜ 1260๋ฒˆ์„ ์˜ˆ๋กœ ๋“ค์–ด์„œ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ๋‹ค.

์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ๊ฐ ๋…ธ๋“œ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ผ 2์ค‘ ๋ฆฌ์ŠคํŠธ์™€ ๊ฐ ๋…ธ๋“œ์˜ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” boolean ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

var visited = booleanArrayOf()
var graph = mutableListOf<MutableList<Int>>()

visited์—๋Š” ๋…ธ๋“œ์˜ ์ˆ˜๋งŒํผ size๋ฅผ ์ง€์ •ํ•ด false ๋˜๋Š” true๋กœ ๋ณ€๊ฒฝํ•ด ์ค„ ์˜ˆ์ •์ด๋‹ค.

graph๋Š” ๋ฐ”๊นฅ ๋ฆฌ์ŠคํŠธ์˜ size๋Š” ๊ฐ node์˜ ๊ฐœ์ˆ˜๋งŒํผ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ๋‚ด๋ถ€์˜ ๋ฆฌ์ŠคํŠธ์˜ size๋Š” ์„ค์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค.

[]            // ๊ฐ’ 0์˜ ์ ‘์ ์€ ์—†์Œ
[2, 3, 4]     // ๊ฐ’ 1์˜ ์ ‘์ ์€ 2, 3, 4
[1, 4]
[1, 4]
[1, 2, 3]

์œ„์˜ ๋ฆฌ์ŠคํŠธ๋Š” graph ๋ฐ์ดํ„ฐ์˜ ์˜ˆ์‹œ์ด๋‹ค. 0๋ฒˆ์งธ ์ค„์€ node 0์˜ ๊ด€๊ณ„๋ฅผ, 1๋ฒˆ์งธ ์ค„์€ node 1์˜ ๊ด€๊ณ„๋ฅผ ๋œปํ•œ๋‹ค.

1๋ฒˆ์งธ ์ค„์— 2, 3, 4๊ฐ€ ๋“ค์–ด ์žˆ๋Š”๋ฐ, node 1์€ node 2, 3, 4์™€ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

 

DFS๋Š” ์Šคํƒ์„ ์ด์šฉํ•œ ์ฝ”๋“œ์™€ ์žฌ๊ท€ ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒ ๋‹ค.

๋จผ์ € ์žฌ๊ท€๋ฅผ ์ด์šฉํ•œ dfs ํ•จ์ˆ˜์ด๋‹ค.

// ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ dfs ๊ตฌํ˜„
private fun dfsRecursion(start: Int) {
    visited[start] = true
    val data = graph[start]
    print("$start ")

    for (node in data) {
        if (!visited[node]) {
            visited[node] = true
            dfsRecursion(node)
        }
    }
}

์‹œ์ž‘์ ์œผ๋กœ ์„ค์ •ํ•  ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š”๋‹ค(start). start๋ฅผ ๊ธฐ์ ์œผ๋กœ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.

์‹œ์ž‘์ ์— ํ•ด๋‹นํ•˜๋Š” index์˜ visited๋ฅผ true๋กœ ๋ฐ”๊พผ๋‹ค(ํ•œ ๋ฒˆ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ํ‘œ์‹œ).

graph์—์„œ start๋ฒˆ์งธ index๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฒ˜์Œ์— ๋ฐ›๋Š” start๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

for๋ฌธ์„ ๋Œ๋ฉด์„œ node์— ํ•ด๋‹น๋˜๋Š” visited๊ฐ€ false์ผ ๋•Œ๋งŒ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ•ด์ค€๋‹ค.

 

๋‹ค์Œ์œผ๋กœ๋Š” ์Šคํƒ์„ ์ด์šฉํ•œ dfs ํ•จ์ˆ˜์ด๋‹ค.

// ์Šคํƒ์„ ์ด์šฉํ•œ dfs ๊ตฌํ˜„
private fun dfs(start: Int) {
    val stack: Stack<Int> = Stack()
    stack.push(start)
    visited[start] = true

    while (stack.isNotEmpty()) {
        val data = stack.pop()
        for (node in graph[data]) {
            if (!visited[node]) {
                stack.push(node)
                visited[node] = true
            }
        }

        print("$data ")
    }
}

์ฒ˜์Œ์— start๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์€ ๋˜‘๊ฐ™๋‹ค.

๋ฐ์ดํ„ฐ ์ˆœํšŒ์šฉ stack์„ ์ƒ์„ฑํ•˜๊ณ , stack์— ์ฒซ ๋ฐ์ดํ„ฐ์ธ start๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  visited์— ์ฒดํฌ๋ฅผ ํ•ด์ค€๋‹ค.

๋‹ค์Œ์œผ๋กœ stack์ด ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

stack์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์•„์™€ data ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  graph์˜ data๋ฒˆ์งธ ๊ฐ’๊ณผ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋Š” ๋ชจ๋“  node๋ฅผ for๋ฌธ์œผ๋กœ ์ฒดํฌํ•œ๋‹ค. 

node๋ฒˆ์งธ visited๊ฐ€ false์ผ ๋•Œ๋งŒ stack์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  visited๋ฅผ true๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

for๋ฌธ์„ ์ข…๋ฃŒํ•˜๊ณ  ์‚ฌ์šฉ๋œ data๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

BFS๋Š” ํ๋ฅผ ์ด์šฉํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ ์ฃผ๊ฒ ๋‹ค.

ํ๋ฅผ ์ด์šฉํ•œ bfs ํ•จ์ˆ˜์ด๋‹ค.

// ํ๋ฅผ ์ด์šฉํ•œ bfs ๊ตฌํ˜„
private fun bfs(start: Int) {
    val queue: Queue<Int> = LinkedList()
    queue.add(start)
    visited[start] = true
    print("$start ")

    while (queue.isNotEmpty()) {
        val data = queue.poll()
        for (node in graph[data]) {
            if (!visited[node]) {
                queue.add(node)
                visited[node] = true
                print("$node ")
            }
        }
    }
}

์Šคํƒ์„ ์ด์šฉํ•œ dfs์™€ ์ดˆ๋ฐ˜์€ ๋น„์Šทํ•˜๋‹ค. ์Šคํƒ ๋Œ€์‹  ํ๋ฅผ ์“ด๋‹ค๋Š” ๊ฒƒ์ด ๋‹ค๋ฅด๋‹ค.

ํ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹œ์ž‘์ ์„ ํ์— ๋„ฃ๊ณ  visited์— ์ฒดํฌํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  start๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

์Šคํƒ์—์„œ ๊ฐ€์žฅ ์ฒ˜์Œ ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ์ธ data๋ฅผ ์ƒ์„ฑํ•˜๊ณ  graph์˜ data๋ฒˆ์งธ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ for๋ฌธ์œผ๋กœ ๋ฐ˜๋ณตํ•œ๋‹ค.

node๋ฒˆ์งธ visited๊ฐ€ false์ด๋ฉด ํ์— ๊ฐ’์„ ๋„ฃ๊ณ  visited๋ฅผ ์ฒดํฌํ•˜๊ณ  ์ถœ๋ ฅํ•œ๋‹ค.

 

1260๋ฒˆ์˜ ์ „์ฒด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค(์Šคํฌ ์ฃผ์˜)

๋”๋ณด๊ธฐ
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.LinkedList
import java.util.Queue
import java.util.Stack

var visited = booleanArrayOf()
// graph๋Š” ๊ฐ ๋…ธ๋“œ์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ„.
//[]            // ๊ฐ’ 0์˜ ์ ‘์ ์€ ์—†์Œ
//[2, 3, 4]     // ๊ฐ’ 1์˜ ์ ‘์ ์€ 2, 3, 4
//[1, 4]
//[1, 4]
//[1, 2, 3]
var graph = mutableListOf<MutableList<Int>>()
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val (n, m, start) = readLine().split(" ").map { it.toInt() }

    graph = MutableList(n+1) { mutableListOf() }
    visited = BooleanArray(n+1)
    for (i in 0 until m) {
        val (relation1, relation2) = readLine().split(" ").map { it.toInt() }

        graph[relation1].add(relation2)
        graph[relation2].add(relation1)
    }

    // ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•ด์ฃผ์–ด์•ผ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ๋จ
    graph.map { it.sort() }

    dfsRecursion(start)
    println()

    visited.fill(false)
    bfs(start)
}

// ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ dfs ๊ตฌํ˜„
private fun dfsRecursion(start: Int) {
    visited[start] = true
    val data = graph[start]
    print("$start ")

    for (node in data) {
        if (!visited[node]) {
            visited[node] = true
            dfsRecursion(node)
        }
    }
}

// ์Šคํƒ์„ ์ด์šฉํ•œ dfs ๊ตฌํ˜„
private fun dfs(start: Int) {
    val stack: Stack<Int> = Stack()
    stack.push(start)
    visited[start] = true

    while (stack.isNotEmpty()) {
        val data = stack.pop()
        for (node in graph[data]) {
            if (!visited[node]) {
                stack.push(node)
                visited[node] = true
            }
        }

        print("$data ")
    }
}

// ํ๋ฅผ ์ด์šฉํ•œ bfs ๊ตฌํ˜„
private fun bfs(start: Int) {
    val queue: Queue<Int> = LinkedList()
    queue.add(start)
    visited[start] = true
    print("$start ")

    while (queue.isNotEmpty()) {
        val data = queue.poll()
        for (node in graph[data]) {
            if (!visited[node]) {
                queue.add(node)
                visited[node] = true
                print("$node ")
            }
        }
    }
}

1260๋ฒˆ์„ ํ’€ ๋•Œ, graph์˜ ๋‚ด๋ถ€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•ด ์ฃผ์–ด์•ผ ๋ฌธ์ œ ์˜ˆ์ œ์— ์•Œ๋งž๊ฒŒ ์ถœ๋ ฅ์ด ๋œ๋‹ค๋Š” ์ ๋งŒ ์ฃผ์˜ํ•˜๋ฉด์„œ ํ’€๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ •๋ฆฌ

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์— ์ž์ฃผ ๋‚˜์˜ค๋Š” ์œ ํ˜•์˜ ๋ฌธ์ œ๋ผ๊ณ  ํ•œ๋‹ค.

2๊ฐ€์ง€์˜ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ์ž์‹ ์ด ํŽธํ•œ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜์ง€๋งŒ, ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” DFS๋ฅผ ์จ์•ผ ํ•˜๊ณ , ๋˜ ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” BFS๋ฅผ ์จ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋‘˜ ๋‹ค ์•Œ์•„ ๋‘์–ด์•ผ ํ•œ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์–ด๋–ป๊ฒŒ ์จ์•ผ ํ•˜๋Š”์ง€ ์•Œ์•˜์œผ๋‹ˆ, ๋ณธ๊ฒฉ์ ์œผ๋กœ ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณผ ์ƒ๊ฐ์ด๋‹ค.

 

 

์ถœ์ฒ˜

https://jin1ib.tistory.com/entry/BFS-DFS-1

 

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Graph Search Algorithm)

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ๋ž€? ์–ด๋–ค ํ•œ ๊ทธ๋ž˜ํ”„์™€ ํ•ด๋‹น ๊ทธ๋ž˜ํ”„์˜ ์‹œ์ž‘ ์ •์ ์ด ์ฃผ์–ด์กŒ์„๋•Œ, ์‹œ์ž‘์ ์—์„œ ๊ฐ„์„ (Edge, E)์„ ํƒ€๊ณ  ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์ (Vertex, V)๋“ค์„ ๋ชจ๋‘ ์ฐพ์•„์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์˜

jin1ib.tistory.com

https://jason-api.tistory.com/133

 

๋ฐฑ์ค€1260๋ฒˆ DFS ์™€ BFS ์ฝ”ํ‹€๋ฆฐ

https://www.acmicpc.net/problem/1260 1260๋ฒˆ: DFS์™€ BFS ์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000), ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ M(1 ≤ M ≤ 10,000), ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•  ์ •์ ์˜ ๋ฒˆํ˜ธ V๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ„์„ ์ด ์—ฐ๊ฒฐํ•˜๋Š”

jason-api.tistory.com

https://velog.io/@daehoon12/%EB%B0%B1%EC%A4%80-1260-DFS%EC%99%80-BFS-Kotlin

 

[๋ฐฑ์ค€ 1260] DFS์™€ BFS (Kotlin)

[๋ฐฑ์ค€ 1260] DFS์™€ BFS (Kotlin)

velog.io

 

728x90

๋Œ“๊ธ€