인접행렬(adjacency matrix) 자료구조 설명
- 인접 행렬(Adjacency Matrix) : 서로 다른 정점들이 인접한 상태인지를 2차원 배열로 나타냄
- 두 정점 사이의 관계 유무 확인에 용이하며, 가장 빠른 경로(shortest path)를 찾을 때 주로 사용
- 두 정점이 연결되어 있다면 1 (true), 두 정점이 연결되어 있지 않다면 0 (false)
코드 작성 포인트
1. 인접 행렬을 받을 변수 선언 및 할당
- const matrix = [];
2. 버텍스 추가하기
- matrix의 기존 엘리먼트들에 각각 0을 푸시해서 배열의 길이 늘려주기
- 새 엘리먼트는 new 키워드와 fill 메소드로 배열을 생성하여 matrix에 push 하기
3. 버텍스 사이 간선 추가/삭제
- 인덱스를 통한 조회 기능으로 엘리먼트를 0 또는 1으로 변환
- 방향 그래프에서 간선 추가하기 : matrix[from][to] = 1
- 무방향 그래프에서 간선 추가하기 : matrix[from][to] = 1, matrix[to][from]=1
인접행렬(adjacency matrix) 구현 코드 (JavaScript)
// 비가중치 방향 그래프의 인접행렬을 구현하기 위한 class 정의
class GraphWithAdjacencyMatrix {
// graph의 constructor를 구현
constructor() {
this.matrix = [];
}
// 버텍스를 추가하는 메소드 구현
addVertex() {
const currentLength = this.matrix.length;
// matrix의 요소인 각 배열 엘리먼트들에게 0을 push 해주기
for (let i = 0; i < currentLength; i++) {
this.matrix[i].push(0);
}
// 0을 요소로 가지는 CurrentLength + 1 길이의 배열을 matrix에 push해줌
this.matrix.push(new Array(currentLength + 1).fill(0));
}
// vertex를 탐색하기
// this.matrix에 vertex가 존재한다면 true를 리턴, 반대의 경우라면 false를 리턴
contains(vertex) {
return !!this.matrix[vertex];
}
// vertex와 vertex를 이어주는 edge를 추가
addEdge(from, to) {
// 현재 배열에서 인덱스의 최대값을 변수에 할당
const currentLength = this.matrix.length - 1;
// 두 가지 인자 중 어느 하나라도 undefined라면 리턴
if (from === undefined || to === undefined) {
console.log("2개의 인자가 있어야 합니다.");
return;
}
// from vertex와 to vertex가 전체 그래프의 범위를 벗어난다면 리턴
if (
from > currentLength ||
to > currentLength ||
from < 0 ||
to < 0
) {
console.log("범위가 매트릭스 밖에 있습니다.");
return;
}
// this.matrix[from][to]의 값을 1로 바꿔 Edge 표시
this.matrix[from][to] = 1;
}
// from vertex와 to vertex 사이에 edge를 가지고 있는지 판단하는 메소드 구현
hasEdge(from, to) {
return !!this.matrix[from][to];
}
// from vertex와 to vertex가 관련이 없다면 edge를 제거하는 메소드 구현
removeEdge(from, to) {
const currentLength = this.matrix.length - 1;
if (from === undefined || to === undefined) {
console.log("2개의 인자가 있어야 합니다.");
return;
}
if (
from > currentLength ||
to > currentLength ||
from < 0 ||
to < 0
) {
console.log("범위가 매트릭스 밖에 있습니다.");
return;
}
// this.matrix[from][to]의 값을 0으로 바꿔줘서 관련이 없음을 표시
this.matrix[from][to] = 0;
}
}
반응형
'프로그래밍 > 알고리즘, 프로그래밍 언어' 카테고리의 다른 글
[알고리즘] 구현 - 보드게임 문제 (JavaScript) (0) | 2021.08.18 |
---|---|
[알고리즘] 이진 탐색 트리 (Binary Search Tree) (0) | 2021.08.11 |
[알고리즘] Tree 자료구조 구현 (JavaScript) (0) | 2021.07.29 |
[알고리즘] Queue로 포장을 마치고 나가는 인원 수 구하기 (0) | 2021.07.27 |
[알고리즘] Queue 자료구조 JavaScript로 구현 (0) | 2021.07.27 |
댓글