그래프

KHW·2021년 7월 12일
0

알고리즘

목록 보기
35/37

코드

class Graph {
  constructor() {
    this.nodes = {};
  }

  addNode(node) {
    this.nodes[node] = this.nodes[node] || [];
  }

  contains(node) {
    return Boolean(this.nodes[node]);
  }

  removeNode(node) {
    if (this.contains(node)) {
      delete this.nodes[node];
    }
  }

  hasEdge(fromNode, toNode) {
    if (this.contains(fromNode) && this.contains(toNode)) {
      if (
        this.nodes[fromNode].includes(toNode) &&
        this.nodes[toNode].includes(fromNode)
      )
        return true;
    }
    return false;
  }

  addEdge(fromNode, toNode) {
    this.nodes[fromNode].push(toNode);
    this.nodes[toNode].push(fromNode);
  }

  removeEdge(fromNode, toNode) {
    if (this.contains(fromNode) && this.contains(toNode)) {
      if (this.hasEdge(fromNode, toNode)) {
        const toInFromIdx = this.nodes[fromNode].indexOf(toNode);
        const fromInToIdx = this.nodes[toNode].indexOf(fromNode);
        this.nodes[fromNode].splice(toInFromIdx, 1);
        this.nodes[toNode].splice(fromInToIdx, 1);
      }
    }
  }
}
  • new Graph() 를 통해 만든 내용 결과
Graph {
  nodes: {
    '1': [ 2 ],
    '2': [ 1, 7 ],
    '3': [ 7, 4 ],
    '4': [ 3, 5 ],
    '5': [ 4 ],
    '6': [ 7 ],
    '7': [ 2, 3, 6 ]
  }
}

코드분석

  • 객체의 키는 노드이고 값은 간선이다.

1. constructor()

nodes 라는 객체의 키를 가진 형태

2. addNode(node)

해당 노드가 없다면 빈 배열의 객체 값을 가진 형태 생성

3. contains(node)

해당 노드를 가지고 있나 체크

4. removeNode(node)

노드가 존재한다면 해당 노드를 삭제

  • delete 연산자 : 객체의 속성을 제거
let o = {
    x:1,
    y:2
}
delete o.x
o				//{y: 2}

객체 o의 프로퍼티가 삭제된다.

5. hasEdge(fromNode, toNode)

간선을 가지고 있는지 체크

  • Array.includes() 메소드 : includes() 메서드는 배열이 특정 요소를 포함하고 있는지 판별
const array1 = [1, 2, 3];

console.log(array1.includes(2));
// expected output: true

6. addEdge(fromNode , toNode)

두 노드 사이의 간선 추가

7. removeEdge(fromNode , toNode)

두 노드 사이의 간선 제거

1) 두 노드 존재 확인 => contains
2) 사이의 간선 존재 확인 => hasEdge
3) 객체 값에 존재하는 인덱스 번호 확인
4) 해당 인덱스 번호 splice를 통해 제거

추가내용

단방향을 하고 싶으면 addEdge 코드에서 push 한쪽을 지운다

profile
나의 하루를 가능한 기억하고 즐기고 후회하지말자

0개의 댓글