๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/์•Œ๊ณ ๋ฆฌ์ฆ˜ (์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ)

๊ทธ๋ž˜ํ”„ - BFS vs DFS (๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ vs ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)

interfacer_han 2026. 9. 4. 13:22

#1 ์ฐจ์ด์˜ ํ•ต์‹ฌ: ๋Œ€๊ธฐ์—ด

BFS์™€ DFS, ๋‘ ํƒ์ƒ‰ ๊ธฐ๋ฒ•์˜ ์ฐจ์ด๋ฅผ ๊ฒฐ์ •์ง“๋Š” ํ•ต์‹ฌ์€ '๋Œ€๊ธฐ์—ด' ๊ด€๋ฆฌ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋Œ€๊ธฐ์—ด์„ ์˜์–ด๋กœ๋Š” Frontier๋ผ๊ณ ๋„ ํ•œ๋‹ค. ๋Œ€๊ธฐ์—ด์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€? "๋‹ค์Œ์— ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ๋“ค์˜ ๋ชฉ๋ก"์ด๋‹ค. ์ด ๋Œ€๊ธฐ์—ด์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์˜ ์ฐจ์ด๊ฐ€ ๊ณง BFS ๋ฐ DFS ๊ฐ„์˜ ์ฐจ์ด๋‹ค.

  BFS DFS
๋Œ€ํ‘œ ์ž๋ฃŒ ๊ตฌ์กฐ Queue Stack
์ž๋ฃŒ ๊ตฌ์กฐ์˜ ์„ฑ์งˆ FIFO
= ๊ฐ€์žฅ ์˜ค๋ž˜ ์ „ ๋“ค์–ด์˜จ ๊ฒƒ์„ ๊บผ๋ƒ„
LIFO
= ๊ฐ€์žฅ ์ตœ๊ทผ ๋“ค์–ด์˜จ ๊ฒƒ์„ ๊บผ๋ƒ„
์„ฑ์งˆ์˜ ์˜๋ฏธ(Meaning) ๋ฐœ๊ฒฌ ์ˆœ์„œ๋ฅผ ๋ณด์กด ๋ฐœ๊ฒฌ ์ˆœ์„œ๋ฅผ ๋ฐ˜์ „
์˜๋ฏธ(Meaning)์—์„œ ํŒŒ์ƒ๋˜๋Š” ๊ฒฐ๊ณผ 1 ๋ถ€๋ชจ ์ชฝ ์ฒ˜๋ฆฌ๊ฐ€ ๋จผ์ € ํ™•์ •(๋๋‚จ) ์ž์‹ ์ชฝ ์ฒ˜๋ฆฌ๊ฐ€ ๋จผ์ € ํ™•์ •(๋๋‚จ)
์˜๋ฏธ(Meaning)์—์„œ ํŒŒ์ƒ๋˜๋Š” ๊ฒฐ๊ณผ 2 ๋Œ€๊ธฐ์—ด์— (๋Œ€์ฒด๋กœ) ๊ฐ™์€ ์ธต์˜ ํ˜•์ œ๋“ค์ด ๋‹ด๊น€ ๋Œ€๊ธฐ์—ด์— (๋Œ€์ฒด๋กœ) ์กฐ์ƒ๋“ค์ด ๋‹ด๊น€

 

#2 ์–ด๋–ป๊ฒŒ ํŒ๋‹จํ•˜๋Š”๊ฐ€?

  BFS DFS
์ผ๋ฐ˜์ ์ธ ํŒ๋‹จ ๋‹ต์ด ์‹œ์ž‘์ ์œผ๋กœ๋ถ€ํ„ฐ์˜ ๊ฑฐ๋ฆฌ์— ์˜์กดํ•  ๋•Œ ๋‹ต์ด ํ•˜์œ„ ๊ตฌ์กฐ์— ์˜์กดํ•  ๋•Œ
์˜ˆ์‹œ(์‚ฌ๋ก€) ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์„œ๋ธŒํŠธ๋ฆฌ ํฌ๊ธฐ(ํ•ฉ)
์—ฐ๊ฒฐ ์š”์†Œ ํฌ๊ธฐ ์„ธ๊ธฐ
์œ„์ƒ ์ •๋ ฌ
์‚ฌ์ดํด ํƒ์ง€
๋ฐฑํŠธ๋ž˜ํ‚น (๊ฒฝ๋กœ๋ฅผ ์Œ“์•˜๋‹ค๊ฐ€ ๋˜๋Œ๋ ค์•ผ ํ•˜๋ฏ€๋กœ Stack ๊ตฌ์กฐ๊ฐ€ ํ•„์ˆ˜)
(์ž˜) ๋ชปํ•˜๋Š” ๊ฒƒ ํ›„์œ„ ์ง‘๊ณ„ (๋ถ€๋ชจ๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๋ฏ€๋กœ) ์ตœ๋‹จ ๊ฑฐ๋ฆฌ (์ฒซ ๋ฐœ๊ฒฌ์ด ์ตœ์ ํ•ด๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ)
(์ผ๋ฐ˜์ ์œผ๋กœ)
๋‘˜ ์ค‘ ์•„๋ฌด๊ฑฐ๋‚˜ ์จ๋„ ๋  ๋•Œ
ํŠน์ • ์ •์ ์— ๋‹ฟ๋Š” ์ง€์˜ ์—ฌ๋ถ€๋งŒ์„ ์ฐธ์กฐ
"๋ฐฉ๋ฌธํ–ˆ์Œ" ํ‘œ์‹œ ๋‚จ๊ธฐ๊ธฐ
๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„ ๋ผ๋ฒจ๋ง

 

#3 ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ ๊ธฐ๋Šฅ์„ ๋ด์•ผ ํ•œ๋‹ค.

BFS๋ƒ DFS๋ƒ๋Š” ์ปดํŒŒ์ผ ์‹œ์ ์— (์šด๋ช…๋ก ์ ์œผ๋กœ) ๊ฒฐ์ •๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋Œ€๊ธฐ์—ด ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ˆœ๊ฐ„์ด ์ปดํŒŒ์ผ ์‹œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ํ•จ์ •์— ๊ฑธ๋ฆฌ๊ณ  ๋งŒ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

 

fun looksLikeBfs(startVertex: MyVertex) {
    val queue = ArrayDeque<MyVertex>()
    queue.add(startVertex)

    while (!queue.isEmpty()) {
        val vertex = queue.removeFirst()
        // TODO
    }
}

์ด ์ฝ”๋“œ๋Š” BFS์ผ๊นŒ DFS์ผ๊นŒ? ๊ฒ‰๋ณด๊ธฐ์—” BFS๋‹ค. ํ•˜์ง€๋งŒ ๋‹ต์€, "๋ชจ๋ฅธ๋‹ค"๋‹ค. TODO ๋ถ€๋ถ„์— ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด์˜ค๋ƒ์— ๋”ฐ๋ผ, ์ด BFS์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋ก  DFS ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ๊ป๋–ผ๊ธฐ ๋ชจ์–‘๋งŒ์œผ๋กœ ํŒ๋‹จํ•ด์„  ์•ˆ ๋œ๋‹ค. ์ด ๊ฒŒ์‹œ๊ธ€์—์„œ ๊ตฌ์ฒด์  ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

 

#4 ์š”์•ฝ

BFS๋Š” ๋ฐœ๊ฒฌ ์ˆœ์„œ๋ฅผ ๋ณด์กดํ•˜๊ณ , DFS๋Š” ๋ฐœ๊ฒฌ ์ˆœ์„œ๋ฅผ ๋ฐ˜์ „์‹œํ‚จ๋‹ค.