๐Ÿ“š Graph ์ด๋ก 

๐Ÿ“š Graph ์ด๋ก 

  • ๋…ธ๋“œ(์ •์ )์™€ ๊ฐ„์„ (์—ฃ์ง€)๋กœ ๊ตฌ์„ฑ๋œ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

๐Ÿ“š ๊ทธ๋ž˜ํ”„์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

  • ์ •์ (Vertex) : ๊ทธ๋ž˜ํ”„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์š”์†Œ. ์˜ˆ๋ฅผ ๋“ค์–ด ์ˆ˜์—…, ๋„์‹œ, ์ปดํ“จํ„ฐ๊ฐ€ ๋œ๋‹ค.
  • ๊ฐ„์„ (Edge) : ์ •์ ๋“ค ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์—ฐ๊ฒฐ์„ . ์˜ˆ๋ฅผ ๋“ค์–ด ๋„์‹œ A์™€ ๋„์‹œ B๊ฐ€ ๋„๋กœ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์„ ํ‘œํ˜„
  • ๊ทธ๋ž˜ํ”„๋Š” ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ ์™€ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
    1. ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ : ๊ฐ„์„ ์— ๋ฐฉํ–ฅ์ด ์žˆ์–ด์„œ ํ•œ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์ด๋™ ๊ฐ€๋Šฅ
    2. ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ : ๊ฐ„์„ ์— ๋ฐฉํ–ฅ์ด ์—†์–ด์„œ, ๋‘ ์ •์  ์‚ฌ์ด๋ฅผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ ๊ฐ€๋Šฅ

๐Ÿš€ ๊ทธ๋ž˜ํ”„ ํ‘œํ˜„ ๋ฐฉ๋ฒ•

  1. ์ธ์ ‘ ํ–‰๋ ฌ
    • ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ž˜ํ”„ ํ‘œํ˜„
    • ๊ทธ๋ž˜ํ”„ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.
  2. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ
    • ๋ฒกํ„ฐ๋‚˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ž˜ํ”„ ํ‘œํ˜„
    • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ์ข‹์•„ ๊ฐ„์„ ์ด ์ ์€ ๊ทธ๋ž˜ํ”„์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ“Š ๊ทธ๋ž˜ํ”„ ์ข…๋ฅ˜

  1. ๋‹จ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ : ๊ฐ ๊ฐ„์„ ์— ๋ฐฉํ–ฅ์ด ์žˆ๋Š” ๊ทธ๋ž˜ํ”„
  2. ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ : ๊ฐ ๊ฐ„์„ ์— ๋ฐฉํ–ฅ์ด ์—†๋Š” ๊ทธ๋ž˜ํ”„
  3. ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„ : ๊ฐ„์„ ์— ๊ฐ€์ค‘์น˜๊ฐ€ ๋ถ€์—ฌ๋œ ๊ทธ๋ž˜ํ”„
  4. ๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„ โ€œ : ๊ฐ„์„ ์— ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋Š” ๊ทธ๋ž˜ํ”„
  5. ์‚ฌ์ดํด์ด ์—†๋Š” ๊ทธ๋ž˜ํ”„ : ๊ฐ„์„ ์— ์˜ํ•ด ์ˆœํ™˜์ด ์—†๋Š” ๊ทธ๋ž˜ํ”„
  6. ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„ : ๋ชจ๋“  ์ •์ ์ด ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ทธ๋ž˜ํ”„
  7. ๋น„์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„ : ์ผ๋ถ€ ์ •์ ๋“ค์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ทธ๋ž˜ํ”„

๐Ÿ’ป ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ธฐ๋ณธ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS) ๊ณผ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS) ์ด๋‹ค.

  1. ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS)
    • ํƒ์ƒ‰ ๋ฐฉ๋ฒ• : ํ•œ ์ •์ ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ, ๊ทธ ์ •์ ์— ์ธ์ ‘ํ•œ ๋ชจ๋“  ์ •์ ๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰
    • ํŠน์ง• : ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰ ์ง„ํ–‰, ๊ฐ ๋ ˆ๋ฒจ์„ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰
    • ์ฃผ์šฉ๋„ : ์ตœ๋‹จ ๊ฒฝ๋กœ ์ฐพ๊ธฐ, ์—ฐ๊ฒฐ์š”์†Œ ์ฐพ๊ธฐ, ๊ทธ๋ž˜ํ”„ ๋„ˆ๋น„ ๊ณ„์‚ฐ ๋“ฑ๋“ฑโ€ฆ
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

void bfs(int start, vector<vector<int>>& graph, vector<bool>& visited) {
    queue<int> q;
    visited[start] = true;
    q.push(start);
    
    while (!q.empty()) {
        int node = q.front();
        q.pop();
        cout << node << " "; // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์ถœ๋ ฅ
        
        for (int neighbor : graph[node]) {
            if (!visited[neighbor]) {
                visited[neighbor] = true;
                q.push(neighbor);
            }
        }
    }
}

int main() {
    int n = 5; // ๋…ธ๋“œ ๊ฐœ์ˆ˜
    vector<vector<int>> graph(n); // ๊ทธ๋ž˜ํ”„ (์ธ์ ‘ ๋ฆฌ์ŠคํŠธ)
    
    // ๊ทธ๋ž˜ํ”„ ์—ฐ๊ฒฐ
    graph[0].push_back(1);
    graph[0].push_back(4);
    graph[1].push_back(2);
    graph[2].push_back(3);
    graph[3].push_back(4);

    vector<bool> visited(n, false); // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ์ถ”์ 

    bfs(0, graph, visited); // ๋…ธ๋“œ 0๋ถ€ํ„ฐ BFS ์‹œ์ž‘

    return 0;
}
  1. ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS)
    • ํƒ์ƒ‰ ๋ฐฉ๋ฒ• : ํ•œ ์ •์ ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ , ๊ทธ ์ •์ ์— ์ธ์ ‘ํ•œ ์ •์ ๋“ค์„ ๊ฐ€๋Šฅํ•œ ๊นŠ์ด๊นŒ์ง€ ํƒ์ƒ‰ ํ•œ ๋‹ค์Œ ๋”์ด์ƒ ํƒ์ƒ‰ํ•  ๊ณณ์ด ์—†์œผ๋ฉด ๋‹ค์‹œ ๋Œ์•„์™€์„œ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    • ํŠน์ง• : ์Šคํƒ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์žฌ๊ท€๋ฅผ ์ด์šฉํ•˜์—ฌ ํƒ์ƒ‰์„ ์ง„ํ–‰
    • ์ฃผ์šฉ๋„ : ๊ทธ๋ž˜ํ”„ ์‚ฌ์ดํด ๊ฒ€์‚ฌ, ๊ฒฝ๋กœ ์ฐพ๊ธฐ ๋“ฑ๋“ฑโ€ฆ
#include <iostream>
#include <vector>

using namespace std;

void dfs(int node, vector<vector<int>>& graph, vector<bool>& visited) {
    visited[node] = true;
    cout << node << " "; // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์ถœ๋ ฅ
    
    for (int neighbor : graph[node]) {
        if (!visited[neighbor]) {
            dfs(neighbor, graph, visited);
        }
    }
}

int main() {
    int n = 5; // ๋…ธ๋“œ ๊ฐœ์ˆ˜
    vector<vector<int>> graph(n); // ๊ทธ๋ž˜ํ”„ (์ธ์ ‘ ๋ฆฌ์ŠคํŠธ)
    
    // ๊ทธ๋ž˜ํ”„ ์—ฐ๊ฒฐ
    graph[0].push_back(1);
    graph[0].push_back(4);
    graph[1].push_back(2);
    graph[2].push_back(3);
    graph[3].push_back(4);

    vector<bool> visited(n, false); // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ์ถ”์ 

    dfs(0, graph, visited); // ๋…ธ๋“œ 0๋ถ€ํ„ฐ DFS ์‹œ์ž‘

    return 0;
}

๐Ÿ›  ๊ทธ๋ž˜ํ”„ ๊ด€๋ จ ์•Œ๊ณ ๋ฆฌ์ฆ˜

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

ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์˜ˆ์‹œ๋ฅผ ์—ฌ๊ธฐ์— ์ „๋ถ€ ์†Œ๊ฐœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค Graph ๊ด€๋ จ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค๋ณด๋ฉด ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ‘ํ•˜๊ฒŒ ๋œ๋‹ค.

๐Ÿ“Œ ๊ทธ๋ž˜ํ”„์˜ ์‚ฌ์ดํด ๊ฒ€์‚ฌ

  • ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ์‚ฌ์ดํด : DFS๋ฅผ ์ด์šฉํ•ด ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์—ญ์ถ”์ (Back Tracking) ์„ ํ†ตํ•ด ์‚ฌ์ดํด์„ ๊ฒ€์‚ฌ
  • ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ์‚ฌ์ดํด : DFS๋ฅผ ์ด์šฉํ•ด ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ถ”์ ํ•˜๋ฉฐ ์‚ฌ์ดํด์„ ๊ฒ€์‚ฌ

๐Ÿ’ก ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ ํ•ด๊ฒฐ์— C++ ์ž๋ฃŒ๊ตฌ์กฐ ์‚ฌ์šฉ

  1. ํ(queue) : BFS ๊ตฌํ˜„์‹œ ์‚ฌ์šฉ๋œ๋‹ค. ํ๋Š” ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๋Š” FIFO ๊ตฌ์กฐ
  2. ์Šคํƒ(stack) : DFS ๋ฐ˜๋ณต ๊ตฌํ˜„์‹œ ์‚ฌ์šฉ๋œ๋‹ค. ์Šคํƒ์€ ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๋Š” LIFO ๊ตฌ์กฐ
  3. ๋งต(map) : ๊ฐ„์„  ์ •๋ณด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜(์ค‘๋ณต ํ™•์ธ ๋“ฑ), ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ์ถ”์ ์— ์‘์šฉ
  4. ์…‹(set) : ๊ทธ๋ž˜ํ”„์—์„œ ์ค‘๋ณต๋œ ๊ฐ„์„ ์ด๋‚˜ ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉ