코딩테스트, 알고리즘

그래프 알고리즘, 깊이/너비 우선 탐색(DFS/BFS)

지은이: 김지은 2023. 11. 28. 23:28
728x90

그래프란?

정점과 간선으로 이루어진 자료구조로 정점간의 관계를 조직도로 표현한다.

 

🔎 정점: 여러가지 특성을 가질 수 있는 객체

🔎 간선: 정점들 간의 관계

 

 

그래프의 종류

무방향 그래프: 정점간 간선에 방향이 없는 그래프

 

 

 

방향 그래프: 정점간 간선에 방향이 있는 그래프

 

 

그래프 알고리즘

너비우선탐색(BFS, Breadth-First Search): 탐색을 시작하는 노드로부터 거리순으로 방문하는 탐색 알고리즘

 

큐(Queue)로 구현하기

function bfs(graph, root) {
    const visited = new Set([root]); // 중복 방문 방지
    const result = []; // 탐색 결과 저장
    const queue = [root]; // 시작 노드로 큐 설정

    // 큐가 비어있지 않을 때 실행
    while (queue.length > 0) {
        const cur = queue.shift();
        result.push(cur);

        // 현재 노드의 인접 노드를 확인하면서 방문하지 않은 노드는 큐와 visited에 추가
        for (const node of graph[cur]) {
            if (!visited.has(node)) {
                queue.push(node);
                visited.add(node);
            }
        }
    }

    return result;
}

시작 노드(0)를 큐에 추가하고 해당 노드를 방문처리 하기 위해서 shift 하기

현재 노드와 연결된 노드 중 방문하지 않은 노드를 큐에 추가하고 추가한 shift 해서 노드를 방문처리하는 과정 반복

 

 

 

깊이우선탐색(DFS, Depth-First Search): 시작하는 노드로부터 갈 수 있는 깊은곳까지 탐색하기를 반복하는 알고리즘

 

스택(Stack)으로 구현하기

function dfs(graph, start) {
    const result = []; // 방문한 노드 저장
    const visited = new Set(); // 방문한 노드 중복 방문 방지
    const stack = [start]; // 시작 노드 초기화

    // 스택이 비어있지 않으면 실행
    while (stack.length > 0) {
        const node = stack.pop();

        // 방문하지 않은 노드만 실행
        if (!visited.has(node)) {
            visited.add(node);
            result.push(node);
            stack.push(...graph[node]);
        }
    }

    return result;
}

시작노드(0)부터 방문해서 방문한 노드를 스택에 추가하고 0을 pop해서 방문처리

0과 연결된 노드 중 방문하지 않은 노드를 스택에 넣고  pop해서 방문 처리 하는 과정 반복

스택이 빌 때까지 반복하고 스택에 더 이상 꺼낼 노드가 없다면 탐색 종료 

 

 

Reference 엘리스