-
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 엘리스
'코딩테스트, 알고리즘' 카테고리의 다른 글
[프로그래머스] H-Index (JS) (0) 2023.12.16 [프로그래머스] 타겟 넘버 (JS) (0) 2023.11.29 연속 부분 최대합으로 알아보는 완전탐색과 시간복잡도 (1) 2023.11.26 동전 거스름돈으로 알아보는 탐욕 알고리즘 (Greedy Algorithm) (0) 2023.11.17 피보나치 수열로 알아보는 동적계획법(Dynamic Programming) (1) 2023.11.16 댓글