๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[๋ฐฑ์ค€/BOJ] 1260๋ฒˆ C++ DFS์™€ BFS, OutOfBounds ์ด์œ 

by ICanDoHee 2022. 3. 6.

https://www.acmicpc.net/problem/1260

 

1260๋ฒˆ: DFS์™€ BFS

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000), ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ M(1 ≤ M ≤ 10,000), ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•  ์ •์ ์˜ ๋ฒˆํ˜ธ V๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ„์„ ์ด ์—ฐ๊ฒฐํ•˜๋Š” ๋‘ ์ •์ ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์–ด๋–ค ๋‘ ์ •์  ์‚ฌ

www.acmicpc.net


 ๋ฐฑ์ค€ 1260๋ฒˆ DFS์™€ BFS๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ๋‹ค. OutOfBounds๊ฐ€ ๋–ด๋Š”๋ฐ, ์ด์— ๋Œ€ํ•œ ์ด์œ ๋Š” ๋ฐ‘์—์„œ ์„ค๋ช…ํ•  ์˜ˆ์ •์ด๋‹ค.

 

  A. B. C. D. E์˜ ์šฐ๋ฌผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ด ์šฐ๋ฌผ์„ ํŒŒ๋Š” ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” A ์šฐ๋ฌผ์„ ๋๊นŒ์ง€ ๋‹ค ํŒ ํ›„์— B๋กœ ๋„˜์–ด๊ฐ€์„œ B๋ฅผ ์ „๋ถ€ ํŒŒ๊ณ , C, D, E๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํŒŒ๋Š” ๊ฒƒ์ด๋‹ค.

 ๋‘ ๋ฒˆ์งธ๋Š” A ์šฐ๋ฌผ์„ 2m ํŒŒ๊ณ , B ์šฐ๋ฌผ์„ 2m ํŒŒ๊ณ , C, D, E๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํŒŒ๋Š” ๊ฒƒ์ด๋‹ค. E๋ฅผ 2m ํŒ ๋‹ค๋ฉด, ๋‹ค์‹œ A๋ฅผ 2m ํŒŒ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์‹œ์— 5๊ฐœ ์šฐ๋ฌผ์„ ํŒŒ๋Š” ๋ฐฉ์‹์ด๋‹ค.

 ์ฒซ ๋ฒˆ์งธ๋Š” DFS์™€ ์œ ์‚ฌํ•œ ํƒ์ƒ‰๋ฐฉ๋ฒ•์ด๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” BFS์™€ ์œ ์‚ฌํ•˜๋‹ค.

 

 DFS(Depth First Search)

 ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์€, ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ํ•ด๋‹น ๋ถ„๊ธฐ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•œ ํ›„, ๋‹ค์Œ ๋ถ„๊ธฐ๋กœ ๋„˜์–ด๊ฐ€๋Š” ํƒ์ƒ‰ ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋Š” ์Šคํƒ์ด๋‚˜, ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

BFS(Breadth First Search)

 ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์€, ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋Š” ํ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.


1260๋ฒˆ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ดํ•ด, ํ•ด์„

 ํ•ด๋‹น ๋ฌธ์ œ์—์„œ๋Š” ๋…ธ๋“œ, ๊ฐ„์„ ์˜ ๊ธธ์ด, ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๊ฐ€ ํ•œ ์ค„์”ฉ ์ œ์‹œ๋œ๋‹ค.

์ด๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์œ„์™€ ๊ฐ™๋‹ค. DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)์˜ ๊ฒฝ์šฐ ์‹œ์ž‘ ๋…ธ๋“œ์ธ 1๋ถ€ํ„ฐ ํƒ์ƒ‰์„ ํ•œ ๋’ค, ์ธ์ ‘ํ•œ ๋…ธ๋“œ์ด๋ฉด์„œ ๊ฐ€์žฅ ์ž‘์€ ์ˆซ์ž์ธ 2๋ฅผ ๋ฐฉ๋ฌธํ•  ๊ฒƒ์ด๊ณ , ๊ทธ ๋‹ค์Œ์€ 2์™€ ์—ฐ๊ฒฐ๋œ 4๋ฅผ ๋จผ์ € ๋ฐฉ๋ฌธํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ ์ดํ›„ 1๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์—ˆ๋˜ 3์„ ๋ฐฉ๋ฌธํ•  ๊ฒƒ์ด๋‹ค.

BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)์˜ ๊ฒฝ์šฐ 1 ํƒ์ƒ‰ ํ›„, ์ธ์ ‘ํ•œ 2๋ฅผ ํƒ์ƒ‰, ๊ทธ๋ฆฌ๊ณ  ์ธ์ ‘ํ•œ 3, 4๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰ํ•  ๊ฒƒ์ด๋‹ค.

 

์ด ๋•Œ ์ค‘์š”ํ•œ ๊ฒƒ์€,

 ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค 2์ฒ˜๋Ÿผ, ์ˆซ์ž๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ž…๋ ฅํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค.

์ด๋ฅผ ๊ฐ„๊ณผํ•  ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋˜๋‹ˆ ์œ ์˜ํ•˜์ž. 

 

๋˜ํ•œ, DFS ๊ฒฐ๊ณผ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ณ  BFS๋„ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์‚ฌ์šฉํ•œ ํ•จ์ˆ˜๋Š” ๊ผญ ์ดˆ๊ธฐํ™”์‹œ์ผœ์ฃผ๋„๋ก ํ•˜์ž.

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
bool visited[1001]; //๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ์ฒดํฌ
vector <int> adj[1001]; //์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ €์žฅ
queue <int> q;
int node, line, s;

void dfs(int now) {
    visited[now] = 1;
    printf("%d ", now);
    for (int i = 0; i < adj[now].size(); i++) { //์ธ์ ‘ํ•œ ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต
        int next = adj[now][i];
        if (!visited[next]) { //์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ํ•œ ๋ฒˆ๋„ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ์ผ ๊ฒฝ์šฐ,
            dfs(next); //ํ•ด๋‹น ์ธ์ ‘ ๋…ธ๋“œ์™€ ๋˜ ์ธ์ ‘ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด DFS. ๊ทธ๋Ÿฌํ•œ ์ด์œ ๋กœ ์žฌ๊ท€ ์‚ฌ์šฉ
        }
    }
}
void bfs(int now) {
    visited[now] = 1;
    q.push(now); //ํ๋ฅผ ๋งŒ๋“ค์–ด ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ์ธ์ ‘ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
    while (!q.empty()) { //ํ๊ฐ€ ๋น„์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ์ „๋ถ€ ํƒ์ƒ‰ํ–ˆ๋‹ค๋Š” ์˜๋ฏธ
        int st = q.front(); 
        printf("%d ", st);
        q.pop(); //ํƒ์ƒ‰์ด ๋๋‚œ ๋…ธ๋“œ๋Š” pop์œผ๋กœ ์ œ๊ฑฐ
        for (int i = 0; i < adj[st].size(); i++) { //์ธ์ ‘ํ•œ ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต
            int next = adj[st][i];
            if (!visited[next]) { //์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ํ•œ ๋ฒˆ๋„ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ์ผ ๊ฒฝ์šฐ,        
                visited[next] = 1; //ํ•ด๋‹น ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ์Œ = ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ์˜๋ฏธ 
                q.push(next);
            }
        }
    }
}

int main() {
    int a, b;  
    scanf("%d %d %d", &node, &line, &s);
    for (int i = 0; i < line; i++) {
        scanf("%d %d", &a, &b);
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    for (int i = 0; i <= node; i++) {
        sort(adj[i].begin(), adj[i].end()); //์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    }
    
    dfs(s);
    printf("\n");
    memset(visited, 0, sizeof(visited)); //ํ•จ์ˆ˜ ์ดˆ๊ธฐํ™”
    bfs(s);

    return 0;
}

adj[i][k]์—์„œ i๋Š” ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ˆซ์ž ์ž์ฒด๋ฅผ, k๋Š” ์ธ๋ฑ์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋งŒ์•ฝ i๊ฐ€ 1์ด๋ผ๋ฉด,

 k ์ž๋ฆฌ์˜ 0๋ฒˆ๋ฐฉ์—๋Š” 2๊ฐ€, 1๋ฒˆ๋ฐฉ์—๋Š” 3์ด, 2๋ฒˆ๋ฐฉ์—๋Š” 4๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค. ์ฆ‰ k ์ž๋ฆฌ์—๋Š” ์ธ์ ‘ํ•œ ๋…ธ๋“œ๊ฐ€ 0๋ฒˆ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ๋“ค์–ด์žˆ๋‹ค.

 

์ด์Šˆ(OutOfBounds ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ) : for ๋ฐ˜๋ณต๋ฌธ ์ข…๋ฃŒ ์กฐ๊ฑด ์„ค์ •

 ์œ„์˜ ์ฝ”๋“œ ์ค‘ "์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ"์ด๋ผ๋Š” ์ฃผ์„ ๋ถ€๋ถ„์„ ์ฃผ๋ชฉํ•˜์ž. adj๋ผ๋Š” ๋ฒกํ„ฐ๋Š” ์ธ์ ‘ํ•œ ๋…ธ๋“œ์˜ ๊ฐ’๋“ค์„ ์ €์žฅํ•œ๋‹ค. ๊ทธ ์ €์žฅํ•œ ๊ฐ’๋“ค์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์ฃผ๊ณ ์ž for ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์ดˆ๋ฐ˜์—๋Š” ์ด ๋ฐ˜๋ณต๋ฌธ์˜ ์ข…๋ฃŒ ์กฐ๊ฑด์„ "๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜"๋งŒํผ์œผ๋กœ ์„ค์ •ํ–ˆ์—ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด, ๋…ธ๋“œ๋ณด๋‹ค ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚จ๋‹ค. ๊ผญ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ž.

 

 ์ด๋Ÿฌํ•œ ์ด์œ ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ๋‹ค๋ฅธ ์ฝ”๋“œ์—์„œ for ๋ฐ˜๋ณต๋ฌธ ์ข…๋ฃŒ์กฐ๊ฑด์„ ์ž˜๋ชป ์„ค์ •ํ•œ ๊ฒƒ์€ ์•„๋‹Œ์ง€, ๋ฒกํ„ฐ๋‚˜ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์•Œ๋งž๊ฒŒ ์„ค์ •ํ–ˆ๋Š”์ง€๋„ ํ™•์ธํ•ด๋ณด์ž.