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이 추가되고, 다른 정점과 아직 연결되어 있지 않은 상태가 된다.