๐Ÿ’ก Algorithm

[๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰] DFS, BFS ์ •๋ฆฌ (with C++)

ji_wonna 2022. 7. 18. 23:33

DFS(Depth-First Search) : ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰


ํŠน์ง•

  • ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ
  • ์žฌ๊ท€ํ•จ์ˆ˜ or ์Šคํƒ์œผ๋กœ ๊ตฌํ˜„


๋™์ž‘ ๊ณผ์ •

์ถœ์ฒ˜ : ์œ„ํ‚คํ”ผ๋””์•„(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)

1. ์‹œ์ž‘ ๋…ธ๋“œ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  visited = true ์ฒ˜๋ฆฌ
2. ์Šคํƒ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ์•„์ง visited X ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค?
์žˆ๋‹ค) visited X ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  visited = true ์ฒ˜๋ฆฌ
์—†๋‹ค) ์Šคํƒ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ ๊บผ๋ƒ„
3. 2๋ฒˆ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต


์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

  • ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋‹ค ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ๊ฒฝ๋กœ์˜ ํŠน์ง•, ์ง€๋‚˜์˜จ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ


์†Œ์Šค์ฝ”๋“œ

#include <iostream>
#include <vector>
using namespace std;

bool visited[9];
vector<int> graph[9];

void dfs(int x) {
	visited[x] = true;//๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
	cout << x << " ";
	for (int i = 0; i < graph[x].size(); i++) {
		int y = graph[x][i];//์ธ์ ‘ ๋…ธ๋“œ
		if (!visited[y]) dfs(y);//๋ฐฉ๋ฌธx->์žฌ๊ท€
	}
}

BFS(Breadth-First Search) : ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰


ํŠน์ง•

  • ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰
  • ํ ์ž๋ฃŒ๊ตฌ์กฐ ์ด์šฉ


๋™์ž‘ ๊ณผ์ •

์ถœ์ฒ˜ : ์œ„ํ‚คํ”ผ๋””์•„(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)

1. ์‹œ์ž‘ ๋…ธ๋“œ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  visited = true ์ฒ˜๋ฆฌ
2. ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ ๋’ค, ์ธ์ ‘ ๋…ธ๋“œ ์ค‘ visited X ๋…ธ๋“œ๋ฅผ ์ „๋ถ€ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  visited = true ์ฒ˜๋ฆฌ
3. 2๋ฒˆ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต


์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

  • ๋ฏธ๋กœ ํƒ์ƒ‰
  • ์ตœ๋‹จ ๊ฒฝ๋กœ
  • ํƒ์ƒ‰ ์ œ์•ฝ ์กฐ๊ฑด์ด ์—†๋Š” ๊ฒฝ์šฐ ex) ๊ฐ€์ค‘์น˜


์†Œ์Šค์ฝ”๋“œ

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

bool visited[9];
vector<int> graph[9];

void bfs(int start) {
	queue<int> q;
	q.push(start);//์ฒ˜์Œ ๋…ธ๋“œ ์‚ฝ์ž…
	visited[start] = true;//๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
	while (!q.empty()) {
		int x = q.front();
		q.pop();//๋งจ ์•ž ๋…ธ๋“œ ๊บผ๋ƒ„
		cout << x << " ";
		for (int i = 0; i < graph[x].size(); i++) {
			int y = graph[x][i];//์ธ์ ‘ ๋…ธ๋“œ
			if (!visited[y]) {
               		//๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ํ์— ์‚ฝ์ž…
				q.push(y);
				visited[y] = true;//๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
			}
		}
	}
}