Home Week5 - DFS
Post
Cancel

Week5 - DFS

๐Ÿ“ ๋ฌธ์ œ ๋ชฉ๋ก


๊ฐœ์ธ์ ์œผ๋กœ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•œ ๊ฒƒ์œผ๋กœ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ง€์ ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค๐Ÿ™


1. ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜

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

๊ฐ„์„  ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ทธ๋ž˜ํ”„์˜ ํ‘œํ˜„ ๋ฐฉ์‹์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ๋‘˜์€ ์ƒ๋ฐ˜๋œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋ฏ€๋กœ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐฉ์‹์„ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.
(V: ์ •์  ๊ฐœ์ˆ˜, E: ๊ฐ„์„  ๊ฐœ์ˆ˜)

  • ์ธ์ ‘ ํ–‰๋ ฌ: O(V^2)
    ๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•˜์—ฌ DFS()๋ฅผ ํ˜ธ์ถœ => O(V)
    ํ•œ ์ •์ ์— ์—ฐ๊ฒฐ๋œ ์ •์ ๋“ค์„ ์ˆœํšŒํ•  ๊ฒฝ์šฐ ๋ชจ๋“  V๊ฐœ์˜ ์ •์ ์— ๋Œ€ํ•ด ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€ ์ฒดํฌ => O(V)
    Good: ์–ด๋–ค ๊ฐ„์„ ์ด ์กด์žฌํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด ์ ‘๊ทผ์ด ๋น ๋ฅด๋‹ค. ์ฆ‰ ๋‘ ์ •์  ๊ฐ„ ์—ฐ๊ฒฐ ์—ฌ๋ถ€๋ฅผ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค.(O(1))
    Bad: ๊ฐ„์„ ์ด ์ ์„ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ์ข‹์ง€ ์•Š๊ณ  ๋ถˆํ•„์š”ํ•œ ํƒ์ƒ‰ ์‹œ๊ฐ„์ด ๋งŽ์•„์ง„๋‹ค.

  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ: O(V+E)
    ๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•˜์—ฌ DFS()๋ฅผ ํ˜ธ์ถœ => O(V)
    ํ•œ ์ •์ ์— ์—ฐ๊ฒฐ๋œ(=๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋œ) ์ •์ ๋งŒ์„ ์ˆœํšŒ => ์ด O(E)
    Good: ๊ฐ„์„ ์ด ์ ์„ ๋•Œ ์—ฐ๊ฒฐ๋œ ์ •์  ์ •๋ณด๋งŒ์ด ์ €์žฅ๋˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ์ข‹๋‹ค.
    Bad: ์–ด๋–ค ๊ฐ„์„ ์˜ ์กด์žฌ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค๊ณ  ํ•  ๋•Œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ผ์ผ์ด ๋’ค์ ธ์•ผ ํ•˜๋ฏ€๋กœ ๋น„๊ต์  ์ ‘๊ทผ์ด ๋Š๋ฆฌ๋‹ค.(์ตœ์•…์˜ ๊ฒฝ์šฐ O(V))

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ฐ„์„ ์ด ๋ณ„๋กœ ์—†๋Š” ํฌ์†Œ ๊ทธ๋ž˜ํ”„(sparse graph)์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์™€ ์‹œ๊ฐ„ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ธ์ ‘ ํ–‰๋ ฌ๋ณด๋‹ค ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ ํ•ฉํ•˜๊ฒ ์ง€๋งŒ
๊ฐ„์„ ์ด ๋งŽ์€ ๋ฐ€์ง‘ ๊ทธ๋ž˜ํ”„(dense graph)์˜ ๊ฒฝ์šฐ๋ผ๋ฉด ์ธ์ ‘ ํ–‰๋ ฌ๊ณผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์–‘์ด ๋น„์Šทํ•ด์งˆ ๊ฒƒ์ด๊ณ , ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋‚˜ ๊ฐ„์„  ํƒ์ƒ‰ ์‹œ๊ฐ„์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ์˜คํžˆ๋ ค ์ธ์ ‘ ํ–‰๋ ฌ์ด ๋‚˜์„ ๊ฒƒ์ด๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ์‹์œผ๋กœ ์ €์žฅํ–ˆ์ง€๋งŒ boolํ˜• 2์ฐจ์› ๋ฒกํ„ฐ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— intํ˜• 2์ฐจ์› ๋ฒกํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ์™€ ์‹œ๊ฐ„์ด ์ ๊ฒŒ ๋‚˜์™”๋‹ค. ๋งŒ์•ฝ ๊ฐ„์„ ์— ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ํ•ด์„œ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์™€ ๊ฐ™์€ intํ˜•์œผ๋กœ ์ €์žฅํ•œ๋‹ค๋ฉด ์‚ฌ์šฉ ๋ฉ”๋ชจ๋ฆฌ์™€ ์‹œ๊ฐ„์ด ๋” ํฌ๊ฒŒ ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค.

์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<iostream>
#include<vector>

using namespace std;

bool isVisited[1001] = { false };
int cnt = 0;
vector<vector<bool>> adj;

void dfs(int v) {
	isVisited[i] = true;
	for (int i = 1; i < adj[v].size(); i++) {
		if (adj[v][i] && !isVisited[i]) {
			dfs(i);
		}
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n, m;
	cin >> n >> m;

	adj.assign(n + 1, vector<bool>(n+1, false));

	for (int i = 0; i < m; i++) {
		int u, v;
		cin >> u >> v;
		adj[u][v] = true;
		adj[v][u] = true;
	}

	for (int i = 1; i <= n; i++) {
		if (!isVisited[i]) {
			dfs(i);
			cnt++;
		}
	}

	cout << cnt;
}


2. BFS์™€ DFS

์ œ๋ชฉ์ด ๊ณง ๋‚ด์šฉโ€ฆ์ •์  ๊ฐœ์ˆ˜ N, ๊ฐ„์„  ๊ฐœ์ˆ˜ M, ์‹œ์ž‘ ์ •์  V์™€ ๊ฐ„์„  ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง€๋ฉด DFS์™€ BFS๋ฅผ ์‚ฌ์šฉํ•ด ํƒ์ƒ‰ ์ˆœ์„œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<iostream>
#include<queue>

using namespace std;

bool isVisited[1001]{ false };
bool isConnected[1001][1001]{ false };
int n;

void dfs(int v) {
	cout << v << " ";
	isVisited[v] = true;

	for (int i = 1; i <= n; i++) {
		if (isConnected[v][i] && !isVisited[i]) {
			dfs(i);
		}
	}
}

void bfs(int v) {
	queue<int> q;
	isVisited[v] = true;
	q.push(v);

	while (!q.empty()) {
		int cur = q.front();
		cout << cur << " ";
		q.pop();
		for (int i = 1; i <= n; i++) {
			if (isConnected[cur][i] && !isVisited[i]) {
				isVisited[i] = true;
				q.push(i);
			}
		}
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int m, v;
	cin >> n >> m >> v;

	for (int i = 0; i < m; i++) {
		int a, b;
		cin >> a >> b;
		isConnected[a][b] = true;
		isConnected[b][a] = true;
	}

	dfs(v);
	
	cout << "\n";
	fill_n(isVisited, n+1, false);

	bfs(v);
}


3. ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค

๊ฐ€์žฅ ๊นŠ์€ ํƒ์ƒ‰ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค. ํ•œ ์ง€์—ญ์—์„œ ๋‹ค๋ฅธ ์ง€์—ญ์œผ๋กœ ์ด๋™ ์‹œ ํ˜„์žฌ ์œ„์น˜์˜ ์ƒ/ํ•˜/์ขŒ/์šฐ ์ค‘ ํ•œ ๊ณณ์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ, ์ด๋™๊ฐ€๋Šฅ ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1
2
โ‘  ์ฃผ์–ด์ง„ ๋งต(nร—n) ๋‚ด
โ‘ก ํ˜„์žฌ ์ง€์—ญ์˜ ๊ฐ’๋ณด๋‹ค ํฐ ๊ณณ

์ด๋ ‡๊ฒŒ ๋” ์ด์ƒ ์ด๋™ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ์ด๋™ํ–ˆ์„ ๋•Œ ์–ด๋Š ์นธ์—์„œ ์‹œ์ž‘ํ•ด์•ผ ๊ฐ€์žฅ ๋งŽ์€ ์นธ์„ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์ฐพ์•„ ์ตœ๋Œ€ ์ด๋™ ์นธ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค๋งŒ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์ด ์žˆ๋‹ค.
์ฒ˜์Œ์— ์ œ์ถœํ•œ ์ฝ”๋“œ์—์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ, ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต ์—ฐ์‚ฐ์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์–ด์ฐจํ”ผ ์–ด๋–ค ์นธ์— ๋Œ€ํ•œ ์ตœ๋Œ€ ์ด๋™ ํšŸ์ˆ˜๋Š” ์ •ํ•ด์ ธ ์žˆ์œผ๋ฏ€๋กœ ํ•œ๋ฒˆ DFS๋ฅผ ์ˆ˜ํ–‰ํ•ด์„œ ๊ทธ ์นธ์— ๋Œ€ํ•œ ์ตœ๋Œ€ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ–ˆ๋‹ค๋ฉด ์ดํ›„ ์žฌ๋ฐฉ๋ฌธ ์‹œ DFS๋ฅผ ๋˜ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
(ํ˜„์žฌ ๊ฒฝ๋กœ์—์„œ๋Š” ์žฌ๋ฐฉ๋ฌธํ•  ์ผ์ด ์—†์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์—์„œ ์žฌ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค.)
์ฆ‰ DP๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ์ €์žฅ(๋ฉ”๋ชจ์ด์ œ์ด์…˜)ํ•ด๋†“๊ณ , ๋‹ค์Œ์— ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•  ๋•Œ ์ €์žฅํ•ด๋†“์€ ๊ฐ’๋งŒ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.
๋”ฐ๋ผ์„œ ์ด๋Ÿฐ์‹์œผ๋กœ ์–ด๋–ค ์นธ์—์„œ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์ด๋™ ๊ฐ€๋Šฅํ•œ ์นธ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์— 1์„ ๋”ํ•œ ๊ฐ’์ด ํ˜„์žฌ ์นธ์˜ ์ตœ๋Œ€ ์ด๋™ ์นธ ์ˆ˜๊ฐ€ ๋œ๋‹ค.
DP๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์ „์ฒด ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n^2)์ด ๋œ๋‹ค.

์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<iostream>
#include<queue>

using namespace std;

int n;
int map[501][501];
int cnt[501][501]{ 0 };
int dir[4][2]{ {-1,0},{1,0},{0,-1},{0,1} };

int dfs(int x, int y) {
	if (cnt[x][y] == 0) {
		for (int i = 0; i < 4; i++) {
			int next_x = x + dir[i][0];
			int next_y = y + dir[i][1];
			if (next_x > 0 && next_x <= n && next_y > 0 && next_y <= n &&
				map[x][y] < map[next_x][next_y]) {
				int tmp = dfs(next_x, next_y) + 1;
				if (cnt[x][y] < tmp) cnt[x][y] = tmp;
			}
		}
	}
	return cnt[x][y];
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int max = 0;

	cin >> n;

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			cin >> map[i][j];
		}
	}

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			int tmp = dfs(i, j);
			if (max < tmp) max = tmp;
		}
	}

	cout << max+1;
}
This post is licensed under CC BY 4.0 by the author.

Week4 - BFS

Week6 - Floyd Warshall

Comments powered by Disqus.