ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
๐Ÿš€ BFS: The Jedi Mind Trick for Graph Traversal (Why Itโ€™s More Than Just a Queue)
Dev.toDev.to
Backend

FIFO Queue ๊ธฐ๋ฐ˜ BFS ๋„์ž…์„ ํ†ตํ•œ Unweighted Graph ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ณด์žฅ ๋ฐ Stack Overflow ํ•ด๊ฒฐ

๐Ÿš€ BFS: The Jedi Mind Trick for Graph Traversal (Why Itโ€™s More Than Just a Queue)

Timevolt2026๋…„ 6์›” 14์ผ8๋ถ„intermediate

Context

Unweighted Graph ํ™˜๊ฒฝ์—์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ Naive DFS ์ฑ„ํƒ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌดํ•œ ๋ฃจํ”„์™€ ์ง€์ˆ˜์  ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ฌธ์ œ ๋ถ„์„. ํŠนํžˆ ๋Œ€๊ทœ๋ชจ Grid ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ ์žฌ๊ท€ ํ˜ธ์ถœ๋กœ ์ธํ•œ Call Stack Overflow ์œ„ํ—˜์„ฑ ์กด์žฌ.

Technical Solution

  • FIFO Queue ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•œ Layer-by-layer ํƒ์ƒ‰์œผ๋กœ ์‹œ์ž‘์ ์œผ๋กœ๋ถ€ํ„ฐ ๋™์ผ ๊ฑฐ๋ฆฌ์˜ ๋…ธ๋“œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ตฌ์กฐ ์„ค๊ณ„
  • ๋ฐฉ๋ฌธ ๋…ธ๋“œ์— ๋Œ€ํ•œ Visited Set ๊ด€๋ฆฌ๋กœ ์ค‘๋ณต ๋ฐฉ๋ฌธ์„ ์ฐจ๋‹จํ•˜์—ฌ ์ˆœํ™˜ ๊ทธ๋ž˜ํ”„ ๋‚ด ๋ฌดํ•œ ๋ฃจํ”„ ๋ฐฉ์ง€ ๋ฐ $O(V+E)$ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋‹ฌ์„ฑ
  • ์žฌ๊ท€ ๊ธฐ๋ฐ˜์˜ DFS ๋Œ€์‹  Iterative Queue ๋ฐฉ์‹์„ ๋„์ž…ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์Šคํƒ ์ œ์•ฝ ์—†๋Š” ์•ˆ์ •์ ์ธ Grid ํƒ์ƒ‰ ํ™˜๊ฒฝ ๊ตฌ์ถ•
  • ์ƒํƒœ ๊ธฐ๋ฐ˜ ํƒ์ƒ‰(State-based Search)์œผ๋กœ ํ™•์žฅํ•˜์—ฌ ํŠน์ • ์กฐ๊ฑด(์˜ˆ: ์žฅ์• ๋ฌผ ์ œ๊ฑฐ ํšŸ์ˆ˜)์ด ํฌํ•จ๋œ ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ์„ฑ ํ™•๋ณด
  • Word Ladder ๋ฌธ์ œ์™€ ๊ฐ™์ด ๋‹จ์–ด ๊ฐ„ ๋ณ€ํ™˜ ๋‹จ๊ณ„๋ฅผ Edge๋กœ ์ •์˜ํ•œ Graph ๋ชจ๋ธ๋ง์„ ํ†ตํ•œ ์ตœ๋‹จ ๋ณ€ํ™˜ ์‹œํ€€์Šค ๋„์ถœ

- ๊ฐ€์ค‘์น˜ ์—†๋Š” ๊ทธ๋ž˜ํ”„์—์„œ '์ตœ์†Œ ๋‹จ๊ณ„' ๋˜๋Š” '์ตœ๋‹จ ๊ฒฝ๋กœ' ์š”๊ตฌ ์‹œ BFS ์šฐ์„  ๊ณ ๋ ค - ๋Œ€๊ทœ๋ชจ Grid ํƒ์ƒ‰ ์‹œ Call Stack ํ•œ๊ณ„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์žฌ๊ท€ DFS๋ณด๋‹ค Iterative BFS ์ฑ„ํƒ ๊ฒ€ํ†  - Queue์— ๋…ธ๋“œ๋ฅผ Pushํ•˜๋Š” ์ฆ‰์‹œ Visited ๋งˆํ‚น์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ค‘๋ณต ํ์ž‰์œผ๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ ๋ฐ ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐฉ์ง€ - ๋ฌธ์ œ ์ •์˜ ์‹œ ๋…ธ๋“œ์™€ ์—์ง€์˜ ๊ด€๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ๋ชจ๋ธ๋งํ•˜์—ฌ ํƒ์ƒ‰ ๊ณต๊ฐ„์˜ ์ตœ์ ํ™” ์ˆ˜ํ–‰

์›๋ฌธ ์ฝ๊ธฐ