๐Ÿ“˜/๐Ÿ“Œ ์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค

[์ด์ฝ”ํ…Œ] P2 ์ฃผ์š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์‹ค์ „ ๋ฌธ์ œ: DFS/BFS

๋ƒ…๋„ 2024. 10. 28. 00:12

DFS

DFS(Depth-First Search) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํŠน์ •ํ•œ ๊ฒฝ๋กœ๋กœ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ ํŠน์ •ํ•œ ์ƒํ™ฉ์—์„œ ์ตœ๋Œ€ํ•œ ๊นŠ์ˆ™์ด ๋“ค์–ด๊ฐ€์„œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ํ›„, ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  2. ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
  3. (๋˜ํ•œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์œผ๋ฉด ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ์ˆœ์„œ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•œ๋‹ค.)
  4. 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) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค. ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ์— ๋„ฃ๋„๋ก ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋จผ์ € ๋“ค์–ด์˜จ ๊ฒƒ์ด ๋จผ์ € ๋‚˜๊ฐ€๊ฒŒ ๋˜์–ด ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  2. ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  3. (๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๋•Œ, ์ˆซ์ž๊ฐ€ ์ž‘์€ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋จผ์ € ํ์— ์‚ฝ์ž…ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.)
  4. 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];
}