codestates/section4
Implementation Graph
나아눙
2023. 3. 15. 09:12
class GraphWithAdjacencyMatrix {
constructor() {
this.matrix = [];
}
//이차원 배열(matrix)을 초기화
addVertex() {
//버텍스를 추가합니다.
const currentLength = this.matrix.length;
for (let i = 0; i < currentLength; i++) {
this.matrix[i].push(0);
}
this.matrix.push(new Array(currentLength + 1).fill(0));
//새로운 행(즉, 새로운 정점)을 만들고, 이를 matrix 배열의 끝에 추가
//새로운 정점은 다른 정점과 아직 연결되어 있지 않은 상태
//currentLength + 1 길이의 새로운 배열을 생성하고,
//이 배열의 모든 요소를 0으로 채우는 방법
}
//새로운 정점을 추가
//matrix에 새로운 행과 열을 추가하여 이차원 배열의 크기를 조정
//이때, 새로 추가되는 행과 열은 모두 0으로 채워진다.
contains(vertex) {
//TODO: 버텍스가 있는지 확인합니다.
return vertex >= 0 && vertex < this.matrix.length;
}
//해당 정점(vertex)이 matrix 내에 존재하는지 확인
//vertex의 값이 0 이상이고, matrix의 길이보다 작은 경우 true를 반환
addEdge(from, to) {
const currentLength = this.matrix.length;
if (from === undefined || to === undefined) {
console.log("2개의 인자가 있어야 합니다.");
return;
}
// from과 to가 매트릭스 범위 내에 있는 경우에만 간선을 추가합니다.
if (from < currentLength && to < currentLength && from >= 0 && to >= 0) {
//from 정점에서 to 정점으로 가는 간선을 추가
this.matrix[from][to] = 1;
//from과 to가 모두 정상적인 값인 경우, matrix[from][to]를 1로 설정하여 간선을 추가
} else {
console.log("범위가 매트릭스 밖에 있습니다.");
}
}
hasEdge(from, to) {
//TODO: 두 버텍스 사이에 간선이 있는지 확인합니다.
return this.matrix[from][to] === 1;
}
// from 정점에서 to 정점으로 가는 간선이 존재하는지 확인
// matrix[from][to]의 값이 1인 경우 true를 반환
removeEdge(from, to) {
const currentLength = this.matrix.length;
if (from === undefined || to === undefined) {
console.log("2개의 인자가 있어야 합니다.");
return;
}
//TODO: 간선을 지울 수 없는 상황에서는 지우지 말아야 합니다.
if (from + 1 > currentLength || to + 1 > currentLength || from < 0 || to < 0) {
console.log("범위가 매트릭스 밖에 있습니다.");
return;
}
//TODO: 간선을 지워야 합니다.
this.matrix[from][to] = 0;
// from과 to가 모두 정상적인 값인 경우, matrix[from][to]를 0으로 설정하여 간선을 제거
}
}
addVertex() 함수가 이해가 안가서 분석을 해봤다.
0 1 2
------
0| 0 1 1
1| 1 0 1
2| 0 0 0
addVertex() 메서드를 호출하면, 새로운 정점 3을 추가하게 된다.
그러면 currentLength 변수의 값은 3이 되고, for 루프를 통해 기존 행들의 맨 뒤에 0을 추가한다.
0 1 2 0
--------
0| 0 1 1 0
1| 1 0 1 0
2| 0 0 0 0
그 다음 new Array(currentLength + 1).fill(0) 구문을 통해 길이가 4이고,
모든 요소가 0인 새로운 배열을 만들어서, 이를 매트릭스 배열의 마지막에 추가
0 1 2 0
--------
0| 0 1 1 0
1| 1 0 1 0
2| 0 0 0 0
3| 0 0 0 0
그 결과, 새로운 정점 3이 추가되고, 다른 정점과 아직 연결되어 있지 않은 상태가 된다.