์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜, BFS(Breadth First Search)

alswlfl 2026. 4. 4. 23:51

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

๊ทธ๋ž˜ํ”„ ํ˜น์€ ํŠธ๋ฆฌ์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•

  • ์™„์ „ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜
  • (๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ธธ์ด๊ฐ€ ๋™์ผํ•  ๋•Œ) ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ํƒ์ƒ‰์ด๋ž€ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์„ ์˜๋ฏธ
  • ๋Œ€ํ‘œ์ ์ธ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜
  • ํ ์ž๋ฃŒ ๊ตฌ์กฐ ์ด์šฉ(DFS-์Šคํƒ, BFS-ํ)

 

ํ ๊ตฌํ˜„

class Queue {
    constructor() {
        this.queue = {};
        this.headIndex = 0;
        this.tailIndex = 0;
    }
    enqueue = (value) => {
        this.queue[this.tailIndex++] = value;
    };
    dequeue = () => {
        const item = this.queue[this.headIndex];
        delete this.queue[this.headIndex];
        this.headIndex++;
        return item;
    };
    peek = () => this.item[this.headIndex];
    getLength = () => this.tailIndex - this.headIndex;
}

const queue = new Queue();

queue.enqueue(5);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(7);
queue.dequeue();
queue.enqueue(1);
queue.enqueue(4);
queue.dequeue();

while (queue.getLength() != 0) {
    console.log(queue.dequeue());
}

 

๊ทธ๋ž˜ํ”„ ํ‘œํ˜„

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

0  
1 2, 3
2 1, 5
3 1, 4, 5
4 3, 5
5 2, 3, 4

 

 

 

๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์‹

  1. ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๊ณ  [๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ]
  2. ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋‚ด์–ด ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
    ์žˆ๋‹ค๋ฉด, ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  [๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ]
  3. 2๋ฒˆ ๊ณผ์ •์„ ๋” ์ด์ƒ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

[์˜ˆ์‹œ]

1. ์‹œ์ž‘ ๋…ธ๋“œ A๋ฅผ ํ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

2. ํ์—์„œ A๋ฅผ ๊บผ๋‚ด์–ด ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ์ธ B, C, D ๋ฐฉ๋ฌธ

3. ํ์—์„œ B๋ฅผ ๊บผ๋ƒˆ์ง€๋งŒ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฌด์‹œ

4. ํ์—์„œ C๋ฅผ ๊บผ๋‚ด์–ด ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ์ธ E, F ๋ฐฉ๋ฌธ

5. ํ์—์„œ D๋ฅผ ๊บผ๋‚ด์–ด ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ์ธ G๋ฅผ ๋ฐฉ๋ฌธ

6. ํ์—์„œ E๋ฅผ ๊บผ๋‚ด์–ด ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ์ธ H๋ฅผ ๋ฐฉ๋ฌธ

7. ํ์—์„œ F๋ฅผ ๊บผ๋ƒˆ์ง€๋งŒ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฌด์‹œ

8. ํ์—์„œ G๋ฅผ ๊บผ๋ƒˆ์ง€๋งŒ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฌด์‹œ

9. ํ์—์„œ H๋ฅผ ๊บผ๋ƒˆ์ง€๋งŒ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฌด์‹œ

10. ํ๊ฐ€ ๋น„์—ˆ์œผ๋ฏ€๋กœ ํƒ์ƒ‰ ์ข…๋ฃŒ

 

BFS ์‚ฌ์šฉ ์˜ˆ์‹œ

  • ๊ฐ„์„ ์˜ ๋น„์šฉ์ด ๋™์ผํ•œ ์ƒํ™ฉ์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ
    - BFS๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์œ ์‚ฌํ•œ ํŠน์ง• ์กด์žฌ
    - ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ๊ฐ„์„ ์˜ ๋น„์šฉ์ด ์„œ๋กœ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ
    - ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ผ๋ฐ˜ ํ ๋Œ€์‹ ์— ์šฐ์„ ์ˆœ์œ„ ํ ์‚ฌ์šฉ
    - ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ํŠน์ • ๋…ธ๋“œ์— ๋Œ€ํ•˜์—ฌ [์ตœ๋‹จ ๊ฑฐ๋ฆฌ]๊ฐ’์ด ๊ฐฑ์‹ ๋  ์ˆ˜ ์žˆ์Œ(๋” ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ)
  • ์™„์ „ ํƒ์ƒ‰์„ ์œ„ํ•ด ์‚ฌ์šฉํ•œ DFS ์†”๋ฃจ์…˜์ด ๋ฉ”๋ชจ๋ฆฌ/์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ๋ฐ›์•„ BFS๋กœ ์žฌ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ
    - DFS์™€ BFS ๋ชจ๋‘ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ตฌํ˜„์ด ์ต์ˆ™ํ•˜๋‹ค๋ฉด BFS ์ถ”์ฒœ
  • ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ DFS๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” BFS๋กœ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ
    - DFS๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฌธ์ œ ํ•ด๊ฒฐ X

 

BFS ์ฝ”๋“œ ์˜ˆ์‹œ

function bfs(graph, start, visited) {
    queue = new Queue();
    queue.enqueue(start);
    visited[start] = true; // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    while (queue.getLength() != 0) {
        const v = queue.dequeue();
        console.log(v);
        for (const i of graph[v]) {
            if (!visited[i]) {
                queue.enqueue(i);
                visited[i] = true;
            }
        }
    }
}

const graph = [[], [2, 3, 4], [1], [1, 5, 6], [1, 7], [3, 8], [3], [4], [5]];
const visited = Array(9).fill(false);
bfs(graph, 1, visited);