๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_20_DFS & BFS ๋ฌธ์ œํ’€์ด ๋ณธ๋ฌธ

๐Ÿฆฅ ์ฝ”ํ…Œ/์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with python

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_20_DFS & BFS ๋ฌธ์ œํ’€์ด

์ง•์ง•์•ŒํŒŒ์นด 2022. 2. 2. 01:41
728x90
๋ฐ˜์‘ํ˜•

220202 ์ž‘์„ฑ

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ใ€Ž์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹คใ€ ์˜ youtube๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค>

https://www.youtube.com/watch?v=e7_H8SLZlHY&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=20 

 

 

 

 

 

< ๋ฌธ์ œ1 > ์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค ๋จน๊ธฐ

: N X M ํฌ๊ธฐ์˜ ์–ผ์Œ ํ‹€

: ๊ตฌ๋ฉ์ด ๋šซ๋ฆฐ ๋ถ€๋ถ„์€ 0, ์นธ๋ง‰์ด ์กด์žฌ ๋ถ€๋ถ„์€ 1

: ๊ตฌ๋ฉ ๋šซ๋ฆฐ ๋ถ€๋ถ„๋ผ๋ฆฌ ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ๋ถ™์–ด์žˆ๋Š” ๊ฒฝ์šฐ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ!

: ์–ผ์Œ ํ‹€์˜ ๋ชจ์–‘์ด ์ฃผ์–ด์กŒ์„ ๋–„ ์ƒ์„ฑ๋˜๋Š” ์ด ์•„์ด์Šคํฌ๋ฆผ์˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ

: ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ๋œ ๋ถ€๋ถ„๋งŒ ์—ฐ๊ฒฐํ•˜๊ธฐ!

 

1) ํŠน์ • ์ง€์ ์˜ ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์‚ดํŽด๋ณด๊ณ  ์ฃผ๋ณ€ ์ง€์ ์ด 0 ์ด๋ฉด ํ•ด๋‹น ์ง€์  ๋ฐฉ๋ฌธ

2) ๋ฐฉ๋ฌธ ์ง„ํ–‰ ๊ณผ์ • ๋ฐ˜๋ณตํ•˜๋ฉด, ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ง€์  ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅ

3) 1~2 ๊ณผ์ • ๋ฐ˜๋ณตํ•˜์—ฌ, ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ง€์ ์˜ ์ˆ˜ ์นด์šดํŠธ!

 

0์œผ๋กœ ๋œ ๋ถ€๋ถ„ ! ์ด 3๊ฐœ์˜ ์•„์ด์Šคํฌ๋ฆผ

 

  • python
# DFS ๋กœ ํŠน์ • ๋…ธ๋“œ ๋ฐฉ๋ฌธ, ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค ๋ฐฉ๋ฌธ
def dfs(x, y) :
    # ์ฃผ์–ด์ง„ ๋ฒ”์œ„ ๋ฒ—์–ด๋‚˜๋ฉด ์ข…๋ฃŒ
    if x <=  -1 or x >= n or y <= -1 or y >= m :
        return False
    
    # ํ˜„์žฌ ๋…ธ๋“œ ์•„์ง ๋ฐฉ๋ฌธ ์•ˆํ–ˆ๋‹ค๋ฉด
    if graph[x][y] == 0 :
        # ํ•ด๋‹น ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        graph[x][y] = 1

        # ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์œ„์น˜๋“ค ๋ชจ๋‘ ์žฌ๊ท€์  ํ˜ธ์ถœ
        dfs(x -1, y)
        dfs(x, y-1)
        dfs(x+1, y)
        dfs(x, y+1)
        return True
    return False


n, m = map(int, input().split())
graph = []
for i in range(n) :
    graph.append(list(map(int, input())))

# ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ์Œ๋ฃŒ์ˆ˜ ์ฑ„์šฐ๊ธฐ
result = 0
for i in range(n) :
    for j in range(m) :
        # ํ˜„์žฌ ์œ„์น˜์—์„œ DFS ์ˆ˜ํ–‰
        if dfs(i, j) == True :
            result += 1

print(result)


# result
# 5 4
# 11100
# 00011
# 11100
# 00000
# 11111
3
  • c++
#include <bits/stdc++.h>

using namespace std;

int n, m;
int graph[1000][1000];

// DFS๋กœ ํŠน์ • ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ  ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค๋„ ๋ฐฉ๋ฌธ
bool dfs(int x, int y) {
    // ์ฃผ์–ด์ง„ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ฆ‰์‹œ ์ข…๋ฃŒ
    if (x <= -1 || x >=n || y <= -1 || y >= m) {
        return false;
    }
    // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
    if (graph[x][y] == 0) {
        // ํ•ด๋‹น ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        graph[x][y] = 1;
        // ์ƒ, ํ•˜, ์ขŒ, ์šฐ์˜ ์œ„์น˜๋“ค๋„ ๋ชจ๋‘ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
        dfs(x - 1, y);
        dfs(x, y - 1);
        dfs(x + 1, y);
        dfs(x, y + 1);
        return true;
    }
    return false;
}

int main() {
    // N, M์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ ๋ฐ›๊ธฐ
    cin >> n >> m;
    // 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์˜ ๋งต ์ •๋ณด ์ž…๋ ฅ ๋ฐ›๊ธฐ
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%1d", &graph[i][j]);
        }
    }
    // ๋ชจ๋“  ๋…ธ๋“œ(์œ„์น˜)์— ๋Œ€ํ•˜์—ฌ ์Œ๋ฃŒ์ˆ˜ ์ฑ„์šฐ๊ธฐ
    int result = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            // ํ˜„์žฌ ์œ„์น˜์—์„œ DFS ์ˆ˜ํ–‰
            if (dfs(i, j)) {
                result += 1;
            }
        }
    }
    cout << result << '\n'; // ์ •๋‹ต ์ถœ๋ ฅ 
}
  • java
import java.util.*;

public class Main {

    public static int n, m;
    public static int[][] graph = new int[1000][1000];

    // DFS๋กœ ํŠน์ • ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ  ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค๋„ ๋ฐฉ๋ฌธ
    public static boolean dfs(int x, int y) {
        // ์ฃผ์–ด์ง„ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ฆ‰์‹œ ์ข…๋ฃŒ
        if (x <= -1 || x >=n || y <= -1 || y >= m) {
            return false;
        }
        // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
        if (graph[x][y] == 0) {
            // ํ•ด๋‹น ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
            graph[x][y] = 1;
            // ์ƒ, ํ•˜, ์ขŒ, ์šฐ์˜ ์œ„์น˜๋“ค๋„ ๋ชจ๋‘ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
            dfs(x - 1, y);
            dfs(x, y - 1);
            dfs(x + 1, y);
            dfs(x, y + 1);
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // N, M์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ ๋ฐ›๊ธฐ
        n = sc.nextInt();
        m = sc.nextInt();
        sc.nextLine(); // ๋ฒ„ํผ ์ง€์šฐ๊ธฐ

        // 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์˜ ๋งต ์ •๋ณด ์ž…๋ ฅ ๋ฐ›๊ธฐ
        for (int i = 0; i < n; i++) {
            String str = sc.nextLine();
            for (int j = 0; j < m; j++) {
                graph[i][j] = str.charAt(j) - '0';
            }
        }

        // ๋ชจ๋“  ๋…ธ๋“œ(์œ„์น˜)์— ๋Œ€ํ•˜์—ฌ ์Œ๋ฃŒ์ˆ˜ ์ฑ„์šฐ๊ธฐ
        int result = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                // ํ˜„์žฌ ์œ„์น˜์—์„œ DFS ์ˆ˜ํ–‰
                if (dfs(i, j)) {
                    result += 1;
                }
            }
        }
        System.out.println(result); // ์ •๋‹ต ์ถœ๋ ฅ 
    }

}

 

 

 

 

 

 

 

< ๋ฌธ์ œ2 > ๋ฏธ๋กœ ํƒˆ์ถœ

: N X M ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜• ํ˜•ํƒœ ๋ฏธ๋กœ์— ๊ฐ‡ํž˜

: ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ ๊ดด๋ฌผ ํ”ผํ•ด์•ผ๋จ

: ๋‚˜๋Š” ์œ„์น˜ (1, 1), ๋ฏธ๋กœ์˜ ์ถœ๊ตฌ๋Š” (N, M)

: ๊ดด๋ฌผ์ด ์žˆ๋Š” ๊ณณ์€ 0, ์—†๋Š” ๊ณณ์€ 1

: ํƒˆ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์›€์ง์—ฌ์•ผ ํ•˜๋Š” ์ตœ์†Œ์˜ ์นธ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๋ผ ( ์‹œ์ž‘ ์นธ, ๋งˆ์ง€๋ง‰ ์นธ ๋ชจ๋‘ ํฌํ•จ )

: BFS ๋กœ ์‹œ์ž‘ ์ง€์ ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ ํƒ์ƒ‰ !

: ๋ชจ๋“  ๋…ธ๋“œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ฐ’์„ ๊ธฐ๋กํ•˜์—ฌ ํ•ด๊ฒฐ !

 

+) ๋™์ž‘ ์›๋ฆฌ

- ์ฒ˜์Œ์—๋Š” (1, 1) ์—์„œ ์‹œ์ž‘

- ์ƒ, ํ•˜, ์ขŒ, ์šฐ ํƒ์ƒ‰ ํ•˜๋ฉด์„œ ๋ฐ”๋กœ ์˜† ๋…ธ๋“œ (1, 2) ๋ฐฉ๋ฌธํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ฐฉ๋ฌธ ์œ„์น˜๋ฅผ 2๋กœ ๋ฐ”๊ฟˆ

- ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๊ฐ’๋“ค์ด 1์”ฉ ์ฆ๊ฐ€ํ•œ ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝ

 

 

  • python
# BFS FH
def bfs(x, y) :
    queue = deque()
    queue.append((x, y))

    # ํ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    while queue :
        x, y = queue.popleft()
        # ํ˜„์žฌ ์œ„์น˜์—์„œ 4๊ฐ€์ง€ ๋ฐฉํ–ฅ์œผ๋กœ ์œ„์น˜ ํ™•์ธ
        for i in range(4) :
            nx = x + dx[i]
            ny = y + dy[i]
            # ๋ฏธ๋กœ ์ฐพ๊ธฐ ๊ณต๊ฐ„ ๋ฒ—์–ด๋‚˜๋ฉด ๋ฌด์‹œ
            if nx < 0 or nx >= n or ny < 0 or ny >= m :
                continue
            # ๋ฒฝ์ด๋ฉด ๋ฌด์‹œ
            if graph[nx][ny] == 0:
                continue
            # ํ•ด๋‹น ๋…ธ๋“œ ์ฒจ ๋ฐฉ๋ฌธํ•˜๋ฉด ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ธฐ๋ก
            if graph[nx][ny] == 1:
                graph[nx][ny] = graph[x][y] + 1
                queue.append((nx, ny))
    # ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฐ˜ํ™˜
    return graph[n-1][m-1]

from collections import deque
n, m = map(int, input().split())
graph = []

for i in range(n) :
    graph.append(list(map(int, input())))

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

print(bfs(0, 0))


# result
# 5 6
# 111000
# 110000
# 111111
# 000111
# 011000
# 0
  • c++
#include <bits/stdc++.h>

using namespace std;

int n, m;
int graph[201][201];

// ์ด๋™ํ•  ๋„ค ๊ฐ€์ง€ ๋ฐฉํ–ฅ ์ •์˜ (์ƒ, ํ•˜, ์ขŒ, ์šฐ) 
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

int bfs(int x, int y) {
    // ํ(Queue) ๊ตฌํ˜„์„ ์œ„ํ•ด queue ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ 
    queue<pair<int, int> > q;
    q.push({x, y});
    // ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๊ธฐ 
    while(!q.empty()) {
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        // ํ˜„์žฌ ์œ„์น˜์—์„œ 4๊ฐ€์ง€ ๋ฐฉํ–ฅ์œผ๋กœ์˜ ์œ„์น˜ ํ™•์ธ
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            // ๋ฏธ๋กœ ์ฐพ๊ธฐ ๊ณต๊ฐ„์„ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ ๋ฌด์‹œ
            if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
            // ๋ฒฝ์ธ ๊ฒฝ์šฐ ๋ฌด์‹œ
            if (graph[nx][ny] == 0) continue;
            // ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์ฒ˜์Œ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ธฐ๋ก
            if (graph[nx][ny] == 1) {
                graph[nx][ny] = graph[x][y] + 1;
                q.push({nx, ny});
            } 
        } 
    }
    // ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฐ˜ํ™˜
    return graph[n - 1][m - 1];
}

int main(void) {
    // N, M์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ ๋ฐ›๊ธฐ
    cin >> n >> m;
    // 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์˜ ๋งต ์ •๋ณด ์ž…๋ ฅ ๋ฐ›๊ธฐ
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%1d", &graph[i][j]);
        }
    }
    // BFS๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
    cout << bfs(0, 0) << '\n';
    return 0;
}
  • java
import java.util.*;

class Node {

    private int x;
    private int y;

    public Node(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return this.x;
    }
    
    public int getY() {
        return this.y;
    }
}

public class Main {

    public static int n, m;
    public static int[][] graph = new int[201][201];

    // ์ด๋™ํ•  ๋„ค ๊ฐ€์ง€ ๋ฐฉํ–ฅ ์ •์˜ (์ƒ, ํ•˜, ์ขŒ, ์šฐ) 
    public static int dx[] = {-1, 1, 0, 0};
    public static int dy[] = {0, 0, -1, 1};

    public static int bfs(int x, int y) {
        // ํ(Queue) ๊ตฌํ˜„์„ ์œ„ํ•ด queue ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ 
        Queue<Node> q = new LinkedList<>();
        q.offer(new Node(x, y));
        // ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๊ธฐ 
        while(!q.isEmpty()) {
            Node node = q.poll();
            x = node.getX();
            y = node.getY();
            // ํ˜„์žฌ ์œ„์น˜์—์„œ 4๊ฐ€์ง€ ๋ฐฉํ–ฅ์œผ๋กœ์˜ ์œ„์น˜ ํ™•์ธ
            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];
                // ๋ฏธ๋กœ ์ฐพ๊ธฐ ๊ณต๊ฐ„์„ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ ๋ฌด์‹œ
                if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
                // ๋ฒฝ์ธ ๊ฒฝ์šฐ ๋ฌด์‹œ
                if (graph[nx][ny] == 0) continue;
                // ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์ฒ˜์Œ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ธฐ๋ก
                if (graph[nx][ny] == 1) {
                    graph[nx][ny] = graph[x][y] + 1;
                    q.offer(new Node(nx, ny));
                } 
            } 
        }
        // ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฐ˜ํ™˜
        return graph[n - 1][m - 1];
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // N, M์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ ๋ฐ›๊ธฐ
        n = sc.nextInt();
        m = sc.nextInt();
        sc.nextLine(); // ๋ฒ„ํผ ์ง€์šฐ๊ธฐ

        // 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์˜ ๋งต ์ •๋ณด ์ž…๋ ฅ ๋ฐ›๊ธฐ
        for (int i = 0; i < n; i++) {
            String str = sc.nextLine();
            for (int j = 0; j < m; j++) {
                graph[i][j] = str.charAt(j) - '0';
            }
        }

        // BFS๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
        System.out.println(bfs(0, 0));
    }

}

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•
Comments