노드와 간선ㅇ리 용한 비선형 데이터 구조. 보통 데이터 간의 관계를 표현하는데 사용




// 예시 코드
const graph = [
// 0 1 2
[ 0, 4, 7 ], // 0번 노드
[ 4, 0, 5 ], // 1번 노드
[ 7, 5, 0 ] // 2번 노드
// graph[0][1] === 4 → 0과 1 사이 간선 가중치 4
// graph[1][2] === 5 → 1과 2 사이 간선 가중치 5
];
인접 리스트를 그래프로 표현하려면 노드를 정의하고 값, 가중치,다음 노드를 묶어서 관리
동작 방식
1. 노드 갯수만큼 배열을 준비
2. 배열의 인덱스는 각 시작 노드를 의미하며, 배열의 값에는 다음 노드를 연결
// 노드를 정의하고 값(인덱스) , 가중치, 다음 노드를 묶어서 관리(
// 간선 노드를 나타내는 클래스
class EdgeNode {
constructor(vertex, weight, next = null) {
this.vertex = vertex; // 도착 노드 번호
this.weight = weight; // 간선의 가중치 (거리, 비용 등)
this.next = next; // 다음 간선을 가리키는 포인터 (연결 리스트 구조)
}
}
// 인접 리스트 방식 그래프 클래스
class Graph {
constructor(n) {
// 노드 수만큼 인접 리스트 배열 생성
// 인덱스 1부터 사용하기 위해 크기를 n + 1로 설정
this.adjList = Array.from({ length: n + 1 }, () => null);
}
// 간선 추가 함수: from → to 방향의 간선 추가
addEdge(from, to, weight) {
// 새 간선 노드를 만든 후, 기존 간선들 앞에 붙임 (head insert 방식)
const newNode = new EdgeNode(to, weight, this.adjList[from]);
// 해당 from 노드의 연결 리스트 갱신
this.adjList[from] = newNode;
}
// 그래프 전체 출력 함수 (디버깅용)
printGraph() {
// 1번 노드부터 마지막 노드까지 순회
for (let i = 1; i < this.adjList.length; i++) {
let line = `${i} -> `; // 출력 줄 시작
let current = this.adjList[i]; // 현재 노드에서 출발하는 간선들
// 연결 리스트 순회
while (current) {
// 도착 노드와 가중치를 출력 문자열에 추가
line += `[${current.vertex}, ${current.weight}] -> `;
current = current.next; // 다음 간선으로 이동
}
line += 'NULL'; // 끝 표시
console.log(line); // 한 줄 출력
}
}
}
// 1. 노드의 갯수만큼 배열을 준비
const graph = new Graph(4);
// 이미지 기준 간선 추가 (from, to, weight)
graph.addEdge(1, 2, 3);
graph.addEdge(2, 1, 6);
graph.addEdge(2, 3, 5);
graph.addEdge(3, 2, 1);
graph.addEdge(3, 4, 13);
graph.addEdge(4, 1, 42);
graph.addEdge(4, 4, 9);
// 그래프 출력
graph.printGraph();
인접 행렬의 장단점
인접 리스트의 장단점
좋아! 너가 쓴 내용은 아주 잘 정리되어 있어.비어 있는 인접 리스트의 장단점 부분을 자연스럽고 정확하게 채워줄게:그래프의 경로를 탐색 할 경우 크게 두가지로 나누어진다.
가장 중요한 핵심은 깊은 노드까지 방문한 후에 더 이상 방문할 노드가 없으면 최근 방문한 노드로 돌아온 다음, 해당 노드에서 방문할 노드가 있느지 확인한다 이다.
진행 순서
1. 시작노드를 정하고, 스택에 시작노드를 푸시한다
2. 스택에서 노드를 pop 한다.
3. pop한 노드의 방문여부를 확인하고, 방문하지 않았다면 방문처리 한다.
4. 방문한 노드와 인접 노드를 확인하고, 방문하지 않은 노드를 스택에 푸시한다.
5. 스택이 비었는지 확인하고. 스택이 비어있다면 전부 방문한 것이므로 종료
시작 노드를 설정하고, 시작 노드로부터 특정 노드까지의 최소 비용을 저장할 공간과 직전 노드를 저장할 공간을 마련합니다.
infinite)를 의미한다.0, 직전 노드는 자기 자신으로 설정한다.해당 노드를 통해 방문할 수 있는 노드 중, 아직 방문하지 않은 노드 중에서 현재까지 구한 최소 비용이 가장 적은 노드를 선택한다.
이 과정을 노드의 개수 - 1번 반복한다.
시작 노드를 설정한 다음,
시작 노드의 최소 비용은 0, 나머지 노드의 비용은 모두 INF(무한대) 로 초기화한다.
이후 최소 비용을 갱신할 때 직전 노드도 함께 갱신한다.
노드 개수 - 1 만큼 아래 연산을 반복한다.
위의 2-1 과정을 마지막으로 한 번 더 수행하여,
만약 여전히 최소 비용이 갱신된다면 음의 사이클(순환)이 존재하는 것이다.