๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ทธ๋ž˜ํ”„ - ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ (BFS, Breadth-First Search)

interfacer_han 2024. 9. 23. 20:27

#1 ๊ทธ๋ž˜ํ”„์˜ ํƒ์ƒ‰

 

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „.

ko.wikipedia.org

๊ทธ๋ž˜ํ”„์˜ ๊ฐ ์ •์ ์„ ํ•œ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๊ทธ ๋ฐฉ๋ฌธ์˜ ๋ฐฉ๋ฒ•์—๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์ด๋‹ค. ๋˜ ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋‹ค. ๋ณธ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰๋ฒ•์„ ๋‹ค๋ฃฌ๋‹ค. (๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์— ๋Œ€ํ•ด์„œ๋Š” ์ด ๊ฒŒ์‹œ๊ธ€์—์„œ ๋‹ค๋ฃฌ๋‹ค)
 

#2 ์•Œ๊ณ ๋ฆฌ์ฆ˜

https://commons.wikimedia.org/wiki/File:Breadth-first-tree.svg

์›๋ž˜๋ผ๋ฉด ์ˆœ์„œ๋„๋ฅผ ํ†ตํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์†Œ๊ฐœํ•˜๊ณ  ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐ€๋Š” ํŽธ์ด ์ดํ•ดํ•˜๊ธฐ ์ข‹์ง€๋งŒ, ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ทธ๋ƒฅ ์ฝ”๋“œ๋ถ€ํ„ฐ ๋ณด๋Š” ๊ฒŒ ์˜คํžˆ๋ ค ์ดํ•ด๊ฐ€ ๋” ๋น ๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋‹ค๋งŒ, ์ธ์ ‘ ๋ฐฐ์—ด (Adjacency Array)์˜ ์ง€์‹์— ๋Œ€ํ•ด์„œ๋Š” ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ „์ œ ํ•˜๋‹ค. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•  ์ธ์ ‘ ๋ฐฐ์—ด์€ ์ด ๊ฒŒ์‹œ๊ธ€์— ์žˆ๋‹ค (๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋Š” ๋ฌดํ–ฅ ๊ทธ๋ž˜ํ”„).

๋Œ€์‹  ์™œ '๋„ˆ๋น„ ์šฐ์„ ' ํƒ์ƒ‰์ด๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™์—ˆ๋Š”์ง€๋Š” ์„ค๋ช…ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค. ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์€ ๋‹ค๋ฅธ ๋ง๋กœ '๋‚ด ์ž์‹ ์šฐ์„ ' ํƒ์ƒ‰์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ž˜ํ”„๋Š” ๊นŠ์ด์˜ ๋†’๋‚ฎ์ด๊ฐ€ ์œ„ ๊ทธ๋ž˜ํ”„์ฒ˜๋Ÿผ y์ถ•๊ณผ ํ‰ํ–‰ํ•˜๊ฒŒ ๊ทธ๋ ค์ง„๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด ์ž์‹์„ ์šฐ์„ ์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค๋Š” ๋ง์€, (2 โ†’ 3 โ†’ 4) โ†’ (5 โ†’ 6 โ†’ 7 โ†’ 8) โ†’ ...์™€ ๊ฐ™์€ ์‹์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค๋Š” ๋ง์ด ๋œ๋‹ค (๊ฐ™์€ ๊ด„ํ˜ธ ๋‚ด์˜ ์ •์ ๋“ค์€ ์„œ๋กœ ์ˆœ์„œ๊ฐ€ ๋’ค๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Œ (#3 ์ฐธ์กฐ)). ์ด ํƒ์ƒ‰์€ x์ถ•(๋„ˆ๋น„)๋ฅผ ์šฐ์„ ํ•ด ์ด๋™ํ•˜๋Š” ๋ชจ์–‘์ด ๋œ๋‹ค (y์ถ• ์ด๋™์€ x์ถ• ํƒ์ƒ‰์ด ์ข…๋ฃŒ๋œ ํ›„์— ์‹œํ–‰๋œ๋‹ค. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์•„๋‹Œ ๊ฒƒ์ด๋‹ค). ๊ทธ๋ž˜์„œ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์ด๋ผ ๋ถ€๋ฅธ๋‹ค.
 

#3 ์ฝ”๋“œ - ์ฝ”ํ‹€๋ฆฐ

#3-1 ๊ธฐ๋ณธ ์ฝ”๋“œ

import java.util.*

fun main() {
    // (1) listOfAdjacencyArray[n]์ด ๊ฐ€์ง€๋Š” ์˜๋ฏธ๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค (์„ค๋ช… ์ฐธ์กฐ)
    val listOfAdjacencyArray = listOf(
        arrayOf(1, 2),
        arrayOf(0, 3, 4),
        arrayOf(0, 4),
        arrayOf(1),
        arrayOf(1, 2)
    )

    bfs(listOfAdjacencyArray, 0)  // 0๋ฒˆ ์ •์ (vertex)์—์„œ ํƒ์ƒ‰ ์‹œ์ž‘
}

fun bfs(listOfAdjacencyArray: List<Array<Int>>, startVertex: Int) {
    // (2) Queue๋กœ ํƒ์ƒ‰ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. discovered๋Š” Queue์— ์ด๋ฏธ ์žˆ๊ฑฐ๋‚˜, ๋ฐฉ๋ฌธ์ด ์™„๋ฃŒ๋œ ์ •์ ๋“ค์„ ๊ธฐ๋กํ•˜๋Š” Set(์ง‘ํ•ฉ)์ด๋‹ค
    val queue: Queue<Int> = LinkedList()
    val discovered = mutableSetOf<Int>()

    // (3) startVertex๋ถ€ํ„ฐ Queue์— ๋„ฃ๋Š”๋‹ค. ๋™์‹œ์— discovered์—๋„ ์ถ”๊ฐ€ํ•œ๋‹ค.
    queue.add(startVertex)
    discovered.add(startVertex)

    while (queue.isNotEmpty()) {
        // (4) ์ •์ ์„ Queue์—์„œ ๋นผ๋‚ด๊ณ , ๋ฐฉ๋ฌธํ•ด์„œ ์ง„ํ–‰ํ•  ์ผ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์—ฌ๊ธฐ์„  doSomethingFunction()์œผ๋กœ ํ‘œํ˜„ํ–ˆ๋‹ค
        val vertex = queue.remove()
//      doSomethingFunction(vertex)
        println("Visit complete: $vertex")

        // (5) (4)์—์„œ ๋นผ๋ƒˆ๋˜(remove()) ์ •์ ์˜ ์ด์›ƒ ์ •์ ๋งˆ๋‹ค (6)์„ ์ˆ˜ํ–‰
        for (neighborVertex in listOfAdjacencyArray[vertex]) {
            // (6) discovered ๋ชฉ๋ก์— ์—†๋‹ค๋ฉด, Queue์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋™์‹œ์— discovered์—๋„ ์ถ”๊ฐ€ํ•œ๋‹ค
            if (neighborVertex !in discovered) {
                queue.add(neighborVertex)
                discovered.add(neighborVertex)
            }
        }
    }
}

(1) listOfAdjacencyArray[n]์ด ๊ฐ€์ง€๋Š” ์˜๋ฏธ๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค
์ •์ ์— ๋ถ€์—ฌ๋œ ๋ฒˆํ˜ธ๊ฐ€ 0 ~ N์ผ ๋•Œ, listOfAdjacencyArray[n]์€ n๋ฒˆ ์ •์ ์— ์—ฐ๊ฒฐ๋œ ์ด์›ƒ(neighbor) ์ •์ ๋“ค์˜ ๋ฐฐ์—ด์„ ์˜๋ฏธํ•œ๋‹ค.

(2) Queue๋กœ ํƒ์ƒ‰ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. discovered๋Š” ...
Queue๋กœ ํƒ์ƒ‰ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค๋Š” ๋ง์€, Queue์— add๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋œ๋‹ค.

(3) startVertex๋ถ€ํ„ฐ Queue์— ๋„ฃ๋Š”๋‹ค. ๋™์‹œ์— discovered์—๋„ ์ถ”๊ฐ€ํ•œ๋‹ค.
์‹œ์ž‘ ์ •์ ์„ Queue์™€ discovered ๊ฐ๊ฐ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

(4) ์ •์ ์„ Queue์—์„œ ๋นผ๋‚ด๊ณ , ๋ฐฉ๋ฌธ...
queue.remove()๋˜์–ด doSomethingFunction()์ด ์ˆ˜ํ–‰๋˜๋Š” ์‹œ์ ๋ถ€ํ„ฐ 'ํ•ด๋‹น ์ •์ ์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค'๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ด€์ ์— ๋”ฐ๋ผ, discovered์— ๋ชฉ๋ก์ด ์ถ”๊ฐ€๋˜๋Š” ์ˆœ๊ฐ„์— ์ •์ ์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜๋„ ์žˆ๊ฒ ์œผ๋‚˜, ๋งŒ์•ฝ ๊ทธ ๊ด€์ ์ด๋ผ๋ฉด doSomethingFunction()์˜ ์œ„์น˜๋ฅผ discovered.add() ์งํ›„๋กœ ์ด๋™์‹œ์ผœ์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ์ด ๊ฒฝ์šฐ์˜ ์ฝ”๋“œ๋Š” #3-3์— ์žˆ๋‹ค.

(5) (4)์—์„œ ๋นผ๋ƒˆ๋˜(remove()) ์ •์ ์˜ ์ด์›ƒ ์ •์ ๋งˆ๋‹ค (6)์„ ์ˆ˜ํ–‰
listOfAdjacencyArray[n]์€ ๋ฐฉ๊ธˆ ๋ฐฉ๋ฌธ ์™„๋ฃŒํ•œ ์ •์  n์— ์—ฐ๊ฒฐ๋œ ์ด์›ƒ ์ •์ ๋“ค์˜ ๋ฐฐ์—ด์ด๋‹ค. ์ด ๋ฐฐ์—ด์˜ ์š”์†Œ๋งˆ๋‹ค (6)์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

(6) discovered ๋ชฉ๋ก์— ์—†๋‹ค๋ฉด, Queue์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋™์‹œ์— discovered์—๋„ ์ถ”๊ฐ€ํ•œ๋‹ค
๋ฐฐ์—ด listOfAdjacencyArray[vertex]์˜ ๊ฐ ์š”์†Œ๋ฅผ Queue์— ๋„ฃ๋Š”๋‹ค. #2์˜ ๋‚ด์šฉ ์ค‘ (2 โ†’ 3 โ†’ 4) โ†’ (5 โ†’ 6 โ†’ 7 โ†’ 8) โ†’ ...์—์„œ ๊ด„ํ˜ธ ์•ˆ์˜ ์ˆœ์„œ๋Š” ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ ์ด์œ ๊ฐ€ ์ด ๋•Œ๋ฌธ์ด๋‹ค. ๋งŒ์•ฝ #2์˜ ๊ทธ๋ž˜ํ”„์˜ ์ธ์ ‘ ๋ฐฐ์—ด์„ ๋งŒ๋“ค ๋•Œ listOfAdjacencyArray[1] = { 3, 4, 2 }๋กœ ๋‘์—ˆ๋‹ค๋ฉด (3 โ†’ 4 โ†’ 2) โ†’ ...์ˆœ์œผ๋กœ Queue์— ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๊ณ , listOfAdjacencyArray[1] = { 4, 2, 3 }๋กœ ๋‘์—ˆ๋‹ค๋ฉด (4 โ†’ 2 โ†’ 3) โ†’ ...์ˆœ์œผ๋กœ Queue์— ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  Queue๋Š” ์„ ์ž…์„ ์ถœ์ด๋ฏ€๋กœ, ๋‹น์—ฐํžˆ ๋ฐฉ๋ฌธ ์ˆœ์„œ ๋˜ํ•œ ๋˜‘๊ฐ™์ด ๋”ฐ๋ผ๊ฐˆ ๊ฒƒ์ด๋‹ค.
 

#3-2 ์ œ๋„ค๋ฆญ์„ ์ด์šฉํ•œ ์ฝ”๋“œ

import java.util.*
import kotlin.collections.HashMap

fun main() {
    // (1) mapOfAdjacencyArray[n]์ด ๊ฐ€์ง€๋Š” ์˜๋ฏธ๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค (์„ค๋ช… ์ฐธ์กฐ)
    val mapOfAdjacencyArray = HashMap<String, Array<String>>()
    mapOfAdjacencyArray["๊ฐ•์•„์ง€"] = arrayOf("๊ณ ์–‘์ด", "์‚ฌ์Šด")
    mapOfAdjacencyArray["๊ณ ์–‘์ด"] = arrayOf("๊ฐ•์•„์ง€", "์ฝ”๋ฟ”์†Œ", "ํฐ๋จธ๋ฆฌ์˜ค๋ชฉ๋ˆˆ์ด")
    mapOfAdjacencyArray["์‚ฌ์Šด"] = arrayOf("๊ฐ•์•„์ง€", "ํฐ๋จธ๋ฆฌ์˜ค๋ชฉ๋ˆˆ์ด")
    mapOfAdjacencyArray["์ฝ”๋ฟ”์†Œ"] = arrayOf("๊ณ ์–‘์ด")
    mapOfAdjacencyArray["ํฐ๋จธ๋ฆฌ์˜ค๋ชฉ๋ˆˆ์ด"] = arrayOf("๊ณ ์–‘์ด", "์‚ฌ์Šด")

    bfs(mapOfAdjacencyArray, "๊ฐ•์•„์ง€")  // "๊ฐ•์•„์ง€" ์ •์ (vertex)์—์„œ ํƒ์ƒ‰ ์‹œ์ž‘
}

fun <T> bfs(mapOfAdjacencyArray: Map<T, Array<T>>, startVertex: T) {
    // (2) Queue๋กœ ํƒ์ƒ‰ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. discovered๋Š” Queue์— ์ด๋ฏธ ์žˆ๊ฑฐ๋‚˜, ๋ฐฉ๋ฌธ์ด ์™„๋ฃŒ๋œ ์ •์ ๋“ค์„ ๊ธฐ๋กํ•˜๋Š” Set(์ง‘ํ•ฉ)์ด๋‹ค
    val queue: Queue<T> = LinkedList()
    val discovered = mutableSetOf<T>()

    // (3) startVertex๋ถ€ํ„ฐ Queue์— ๋„ฃ๋Š”๋‹ค. ๋™์‹œ์— discovered์—๋„ ์ถ”๊ฐ€ํ•œ๋‹ค.
    queue.add(startVertex)
    discovered.add(startVertex)

    while (queue.isNotEmpty()) {
        // (4) ์ •์ ์„ Queue์—์„œ ๋นผ๋‚ด๊ณ , ๋ฐฉ๋ฌธํ•ด์„œ ์ง„ํ–‰ํ•  ์ผ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์—ฌ๊ธฐ์„  doSomethingFunction()์œผ๋กœ ํ‘œํ˜„ํ–ˆ๋‹ค
        val vertex = queue.remove()
//      doSomethingFunction(vertex)
        println("Visit complete: $vertex")

        // (5) (4)์—์„œ ๋นผ๋‚ธ ์ •์ ์˜ ์ด์›ƒ ์ •์ ๋งˆ๋‹ค (6)์„ ์ˆ˜ํ–‰
        for (neighborVertex in mapOfAdjacencyArray[vertex]!!) {
            // (6) discovered ๋ชฉ๋ก์— ์—†๋‹ค๋ฉด, Queue์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋™์‹œ์— discovered์—๋„ ์ถ”๊ฐ€ํ•œ๋‹ค
            if (neighborVertex !in discovered) {
                queue.add(neighborVertex)
                discovered.add(neighborVertex)
            }
        }
    }
}

์ง€๊ธˆ๊นŒ์ง€ ์ •์ ์„ ํŽธ์˜์ƒ Intํ˜•์ด๋ผ๊ณ ๋งŒ ๋‹ค๋ค˜์ง€๋งŒ, ์ •์ ์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ธฐ์ค€์ด ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐํ˜•์ผ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๋„ค๋ฆญ์„ ์ด์šฉํ•ด ๋ฆฌํŒฉํ† ๋งํ•œ ์ฝ”๋“œ๋‹ค. listOfAdjacencyArray๊ฐ€ mapOfAdjacencyArray๋กœ ๋ฐ”๋€ ๊ฒƒ์—๋„ ์ฃผ๋ชฉํ•˜์ž. listOfAdjacencyArray์˜ index๋Š” ๋ฐ˜๋“œ์‹œ Int์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ๊ธฐ์— ์ด index์˜ ์—ญํ• ์„, mapOfAdjacencyArray์˜ key๊ฐ€ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

 

#3-3 doSomethingFunction() ์œ„์น˜ ๋ณ€๊ฒฝ

import java.util.*

fun main() {
    // (1) mapOfAdjacencyArray[n]์ด ๊ฐ€์ง€๋Š” ์˜๋ฏธ๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค (์„ค๋ช… ์ฐธ์กฐ)
    val mapOfAdjacencyArray = HashMap<String, Array<String>>()
    mapOfAdjacencyArray["๊ฐ•์•„์ง€"] = arrayOf("๊ณ ์–‘์ด", "์‚ฌ์Šด")
    mapOfAdjacencyArray["๊ณ ์–‘์ด"] = arrayOf("๊ฐ•์•„์ง€", "์ฝ”๋ฟ”์†Œ", "ํฐ๋จธ๋ฆฌ์˜ค๋ชฉ๋ˆˆ์ด")
    mapOfAdjacencyArray["์‚ฌ์Šด"] = arrayOf("๊ฐ•์•„์ง€", "ํฐ๋จธ๋ฆฌ์˜ค๋ชฉ๋ˆˆ์ด")
    mapOfAdjacencyArray["์ฝ”๋ฟ”์†Œ"] = arrayOf("๊ณ ์–‘์ด")
    mapOfAdjacencyArray["ํฐ๋จธ๋ฆฌ์˜ค๋ชฉ๋ˆˆ์ด"] = arrayOf("๊ณ ์–‘์ด", "์‚ฌ์Šด")

    bfs(mapOfAdjacencyArray, "๊ฐ•์•„์ง€")  // "๊ฐ•์•„์ง€" ์ •์ (vertex)์—์„œ ํƒ์ƒ‰ ์‹œ์ž‘
}

fun <T> bfs(mapOfAdjacencyArray: Map<T, Array<T>>, startVertex: T) {
    // (2) Queue๋กœ ํƒ์ƒ‰ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. visited๋Š” Queue์— ์ด๋ฏธ ์žˆ๊ฑฐ๋‚˜, ๋ฐฉ๋ฌธ์ด ์™„๋ฃŒ๋œ ์ •์ ๋“ค์„ ๊ธฐ๋กํ•˜๋Š” Set(์ง‘ํ•ฉ)์ด๋‹ค
    val queue: Queue<T> = LinkedList()
    val visited = mutableSetOf<T>()

    // (3) startVertex๋ถ€ํ„ฐ Queue์— ๋„ฃ๋Š”๋‹ค. visited์—๋„ ์ถ”๊ฐ€ํ•จ๊ณผ ๋™์‹œ์— ๋ฐฉ๋ฌธํ•ด์„œ ์ง„ํ–‰ํ•  ์ผ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์—ฌ๊ธฐ์„  doSomethingFunction()์œผ๋กœ ํ‘œํ˜„ํ–ˆ๋‹ค
    queue.add(startVertex)
    visited.add(startVertex)
//  doSomethingFunction(startVertex)
    println("Visit complete: $startVertex")

    while (queue.isNotEmpty()) {
        // (4) ์ •์ ์„ Queue์—์„œ ์ œ๊ฑฐํ•œ๋‹ค
        val vertex = queue.remove()

        // (5) (4)์—์„œ ๋นผ๋‚ธ ์ •์ ์˜ ์ด์›ƒ ์ •์ ๋งˆ๋‹ค (6)์„ ์ˆ˜ํ–‰
        for (neighborVertex in mapOfAdjacencyArray[vertex]!!) {
            // (6) visited ๋ชฉ๋ก์— ์—†๋‹ค๋ฉด, Queue์— ๋„ฃ๊ณ  visited์—๋„ ์ถ”๊ฐ€ํ•จ๊ณผ ๋™์‹œ์— ๋ฐฉ๋ฌธํ•ด์„œ ์ง„ํ–‰ํ•  ์ผ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์—ฌ๊ธฐ์„  doSomethingFunction()์œผ๋กœ ํ‘œํ˜„ํ–ˆ๋‹ค
            if (neighborVertex !in visited) {
                queue.add(neighborVertex)
                visited.add(neighborVertex)
//              doSomethingFunction(neighborVertex)
                println("Visit complete: $neighborVertex")
            }
        }
    }
}

Queue์—์„œ ๋นผ๋‚ผ ๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ, ๋“ฑ๋กํ•  ๋•Œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋ฉด doSomethingFunction()์„ ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ (๋…ธ๋“œ๋ฅผ ๋ฐœ๊ฒฌ) == (๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ)์ด๋ฏ€๋กœ, Set์˜ ์ด๋ฆ„๋„ #3-1์—์„œ ์‚ฌ์šฉํ•œ ์ด๋ฆ„์ธ discovered๊ฐ€ ์•„๋‹Œ visited๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

 

#4 ์š”์•ฝ

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์€ ์ธ์ ‘ ๋ฐฐ์—ด์˜ ์›์†Œ๋“ค์„ Queue์— ๋„ฃ๋Š”๋‹ค.