๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ, BFS(Breadth First Search)
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 |
๊ธฐ๋ณธ ๋์ ๋ฐฉ์
- ์์ ๋ ธ๋๋ฅผ ํ์ ๋ฃ๊ณ [๋ฐฉ๋ฌธ ์ฒ๋ฆฌ]
- ํ์์ ์์๋ฅผ ๊บผ๋ด์ด ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋๊ฐ ์๋์ง ํ์ธ
์๋ค๋ฉด, ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ [๋ฐฉ๋ฌธ ์ฒ๋ฆฌ] - 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);