๐/๐ ์ด๊ฒ์ด ์ฝ๋ฉํ
์คํธ๋ค
[์ด์ฝํ ] P2 ์ฃผ์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ค์ ๋ฌธ์ : DFS/BFS
๋
๋
2024. 10. 28. 00:12
DFS
DFS(Depth-First Search) ์๊ณ ๋ฆฌ์ฆ์ ๊น์ด ์ฐ์ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, ๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ํน์ ํ ๊ฒฝ๋ก๋ก ํ์ํ๋ค๊ฐ ํน์ ํ ์ํฉ์์ ์ต๋ํ ๊น์์ด ๋ค์ด๊ฐ์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ํ, ๋ค์ ๋์๊ฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ์คํ์ ์ต์๋จ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ๊ทธ ์ธ์ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
- (๋ํ ์ผ๋ฐ์ ์ผ๋ก ์ธ์ ํ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊ฐ ์ฌ๋ฌ ๊ฐ ์์ผ๋ฉด ๋ฒํธ๊ฐ ๋ฎ์ ์์๋ถํฐ ์ฒ๋ฆฌํ๋ค.)
- 2.์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
bool visited[101];
vector<int> graph[101];
void dfs(int start)
{
visited[start] = true;
for (int i = 0; i < graph[start].size(); i++)
{
int next = graph[start][i];
if (!visited[next])
{
dfs(next);
}
}
}
BFS
BFS(Breadth-First Search) ์๊ณ ๋ฆฌ์ฆ์ ๋๋น ์ฐ์ ํ์์ด๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค. ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ธ์ ํ ๋ ธ๋๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ ๋ฃ๋๋ก ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋จผ์ ๋ค์ด์จ ๊ฒ์ด ๋จผ์ ๋๊ฐ๊ฒ ๋์ด ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์์ ์งํํ๊ฒ ๋๋ค.
- ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ด ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- (๋ง์ฐฌ๊ฐ์ง๋ก ์ธ์ ํ ๋ ธ๋๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ๋, ์ซ์๊ฐ ์์ ๋ ธ๋๋ถํฐ ๋จผ์ ํ์ ์ฝ์ ํ๋ค๊ณ ๊ฐ์ ํ๋ค.)
- 2.์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
bool visited[101];
vector<int> graph[101];
void bfs(int start)
{
queue<int> q;
q.push(start);
visited[start] = true;
while (!q.empty())
{
int current = q.front();
q.pop();
for (int i = 0; i < graph[current].size(); i++)
{
int next = graph[current][i];
if (!visited[next])
{
q.push(next);
visited[next] = true;
}
}
}
}
DFS | BFS | |
---|---|---|
๋์ ์๋ฆฌ | ์คํ | ํ |
๊ตฌํ ๋ฐฉ๋ฒ | ์ฌ๊ท ํจ์ ์ด์ฉ | ํ ์๋ฃ๊ตฌ์กฐ ์ด์ฉ |
์๋ฃ์ ์ผ๋ ค ๋จน๊ธฐ
- ๊ตฌ๋ฉ์ด ๋ซ๋ ค ์๋ ๋ถ๋ถ์ 0, ์นธ๋ง์ด๊ฐ ์กด์ฌํ๋ ๋ถ๋ถ์ 1๋ก ํ์
- ๊ตฌ๋ฉ์ด ๋ซ๋ ค ์๋ ๋ถ๋ถ๋ผ๋ฆฌ ์, ํ, ์ข, ์ฐ๋ก ๋ถ์ด ์๋ ๊ฒฝ์ฐ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
์ ๋ ฅ ์กฐ๊ฑด
- ์ฒซ ๋ฒ์งธ ์ค์ ์ผ์ ํ์ ์ธ๋ก ๊ธธ์ด N๊ณผ ๊ฐ๋ก ๊ธธ์ด M์ด ์ฃผ์ด์ง๋ค. $(1 ≤ N, M ≤ 1,000)$
- ๋ ๋ฒ์งธ ์ค๋ถํฐ N + 1๋ฒ์งธ ์ค๊น์ง ์ผ์ ํ์ ํํ๊ฐ ์ฃผ์ด์ง๋ค.
- ์ด๋ ๊ตฌ๋ฉ์ด ๋ซ๋ ค์๋ ๋ถ๋ถ์ 0, ๊ทธ๋ ์ง ์์ ๋ถ๋ถ์ 1์ด๋ค.
์ถ๋ ฅ ์กฐ๊ฑด
- ํ ๋ฒ์ ๋ง๋ค ์ ์๋ ์์ด์คํฌ๋ฆผ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ ๋ ฅ ์์ 1
4 5
00110
00011
11111
00000
์ถ๋ ฅ ์์ 1
3
์ ๋ ฅ ์์ 2
15 14
00000111100000
11111101111110
11011101101110
11011101100000
11011111111111
11011111111100
11000000011111
01111111111111
00000000011111
01111111111000
00011111111000
00000001111000
11111111110011
11100011111111
11100011111111
์ถ๋ ฅ ์์ 2
8
๐ํ์ด
// dfs.cpp
#include <iostream>
#include <vector>
int dx[4] = { -1,1,0,0 };
int dy[4] = { 0,0,-1,1 };
int map[1001][1001];
bool visited[1001][1001];
int N, M;
int cnt = 0;
using namespace std;
void dfs(int x, int y)
{
visited[x][y] = true;
for (int i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
if (!visited[nx][ny])
{
if (map[x][y] != map[nx][ny]) continue;
dfs(nx, ny);
visited[nx][ny] = true;
}
}
}
void main()
{
cin >> N >> M;
for (int i = 0; i < N; i++)
{
string str;
cin >> str;
for (int j = 0; j < M; j++)
{
map[i][j] = str[j] - '0';
}
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
if (!visited[i][j] && map[i][j] == 0)
{
dfs(i, j);
cnt++;
}
}
}
cout << cnt;
}
๋ฏธ๋ก ํ์ถ
- ๋๋น์ด์ ์์น (1, 1), ๋ฏธ๋ก์ ์ถ๊ตฌ (N, M)์ ์์น
- ๊ดด๋ฌผ์ด ์๋ ๋ถ๋ถ์ 0, ๊ดด๋ฌผ์ด ์๋ ๋ถ๋ถ์ 1๋ก ํ์
- ๋๋น์ด๊ฐ ํ์ถํ๊ธฐ ์ํด ์์ง์ฌ์ผ ํ๋ ์ต์ ์นธ์ ๊ฐ์
์ ๋ ฅ ์กฐ๊ฑด
- ์ฒซ์งธ ์ค์ ๋ ์ ์ N, M$(4 ≤ N, M ≤ 200)$์ด ์ฃผ์ด์ง๋๋ค. ๋ค์ N๊ฐ์ ์ค์๋ ๊ฐ๊ฐ M๊ฐ์ ์ ์(0 ํน์ 1)๋ก ๋ฏธ๋ก์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ์๋ค์ ๊ณต๋ฐฑ ์์ด ๋ถ์ด์ ์ ๋ ฅ์ผ๋ก ์ ์๋๋ค. ๋ํ ์์ ์นธ ๊ณผ ๋ง์ง๋ง ์นธ์ ํญ์ 1์ด๋ค.
์ถ๋ ฅ ์กฐ๊ฑด
- ์ฒซ์งธ ์ค์ ์ต์ ์ด๋ ์นธ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ ๋ ฅ ์์
5 6
101010
111111
000001
111111
111111
์ถ๋ ฅ ์์
10
๐ํ์ด
#include <iostream>
#include <queue>
int dx[4] = { -1,1,0,0 };
int dy[4] = { 0,0,-1,1 };
int map[201][201];
int N, M;
int cnt = 0;
using namespace std;
void bfs(int x, int y)
{
for (int i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
if (map[nx][ny] == 0) continue; // ์์ด๋ ๊ทธ๋ง ์์ด๋ ๊ทธ๋ง
if (map[nx][ny] <= map[x][y])
map[nx][ny] = map[x][y] + 1;
}
}
void main()
{
cin >> N >> M;
for (int i = 0; i < N; i++)
{
string str;
cin >> str;
for (int j = 0; j < M; j++)
{
map[i][j] = str[j] - '0';
}
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
bfs(i, j); // bfs๊ฐ ์๋๊ธด ํจ;;
// queue๋ฅผ ์จ์ ์ฒ์ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ์๋ง bfs ๋๊ฒ ๋ง๋ค๊ธฐ.. ์๊ฐ์ด๊ณผ ์ ์
}
}
cout << map[N-1][M-1];
}