
그래프는 노드(Node, 또는 정점 -vertex- 이라고도 부릅니다), 그리고 노드와 노드를 연결하는 간선(edge)으로 구성됩니다. 그래프는 무방향(undirected)일 수 있습니다. 이는 간선에 의해 연결된 2개의 노드가 대칭일 수 있다는 의미입니다. 한편 방향성(directed)을 가질 수도 있는데, 이는 비대칭 관계를 의미합니다. 이번 스프린트에서는 무방향 그래프를 구현합니다.

노드(node) : 정점(vertice)라고도 불리며, 일반적으로 노드에는 데이터가 저장됨
간선(edge): 링크, arcs라고도 불리며, 노드간의 관계를 나타냄
인접 정점(adjacent vertex) : 간선에 의해 연결된 정점. 위 그림에서 노드A와 B는 인접 정점이라고 할 수 있다
단순 경로(simple-path): 경로 중 반복되는 정점이 없는것, 같은 간선을 자나가지 않는 경로
차수(degree): 무방향 그래프에서 하나의 정점에 인접한 정점의 수. 위 그래프에서 A의 차수는 3이다.
진출차수(out-degree)/진입차수(in-degree) : 방향그래프에서 사용되는 용어
진출 차수 는 한 노드에서 외부로 향하는 간선의 수,
진입차수 는 외부 노드에서 들어오는 간선의 수
그래프의 표현 방식은 인접 행렬과 인접 리스트 두가지 방식으로 나눌 수 있다.
/* Undirected Graph */
class Graph {
  constructor() {
    /*
     *  ex)
     *    nodes = {
     *      0: [ 1, 2 ],
     *      1: [ 0 ],
     *      2: [ 0 ]
     *    }
     */
    this.nodes = {};
  }
  addNode(node) {
    //addNode(node) - 그래프에 노드를 추가합니다.
    this.nodes[node] = this.nodes[node] || [];
  }
  contains(node) {
    //contains(node) - 그래프에 해당 노드가 존재하는지 여부를 반환합니다.
    if(this.nodes[node]) {
      return true;
    }
    return false;
  }
  removeNode(node) {
    //removeNode(node) - 그래프에서 노드를 삭제합니다.
    if(!this.nodes[node]) {
      return undefined;
    } else {
      if(this.nodes[node].length !== 0) {
        for(let edge of this.nodes[node]) {
          this.removeEdge(node, edge);
        }
      }
      delete this.nodes[node];
      return this.nodes;
    }
  }
  hasEdge(fromNode, toNode) {
    //hasEdge(fromNode, toNode) - fromNode와 toNode 사이의 간선 존재 여부를 반환합니다.
    for(let i of this.nodes[fromNode]) {
      if(i === toNode) {
        return true;
      }
    }
    return false;
  }
  addEdge(fromNode, toNode) {
    //addEdge(fromNode, toNode) - fromNode와 toNode 사이의 간선을 추가합니다.
    this.nodes[fromNode].push(toNode);
    this.nodes[toNode].push(fromNode);
  }
  removeEdge(fromNode, toNode) {
    //removeEdge(fromNode, toNode) - fromNode와 toNode 사이의 간선을 삭제합니다.
    delete this.nodes[fromNode].pop(toNode);
    delete this.nodes[toNode].pop(fromNode);
  }
}
module.exports = Graph;