그래프는 단순히 노드와 그 노드를 연결하는 간선(edge)를 하나로 모아 놓은 자료구조다.
즉, 연결되어 있는 객체 간의 관계를 표현할 수 있는 자료 구조이다.
Ex : 지도, 지하철 노선도의 최단 경로등을 나타내기 좋은 자료 구조다!
그래프(Graph)의 특징
무방향 그래프(Undirected Graph)
무방향 그래프의 간선은 간선을 통해서 양 방향으로 갈 수 있다.
정점 A와 정점 B를 연결하는 간선은 (A, B)와 같이 정점의 쌍으로 표현한다.
(A, B)는 (B, A) 동일
Ex) 양방향 통행 도로
방향 그래프(Directed Graph)
간선에 방향성이 존재하는 그래프
A -> B로만 갈 수 있는 간선은 <A, B>로 표시한다.
<A, B>는 <B, A>는 다름
간선에 비용이나 가중치가 할당된 그래프
‘네트워크(Network)’ 라고도 한다.
Ex) 도시-도시의 연결, 도로의 길이, 회로 소자의 용량, 통신망의 사용료 등
1. Add node
1.1. 객체[노드]에 값을 추가한다. 값이 없으면 빈배열 추가
2. Contains
2.1. 만약 노드가 있으면 true 반환
2.2. 없으면 false 반환
3. removeNode
3.1. 만약 노드가 없으면 undefined 반환
3.2. 반복문을 돌려 노드의 모든 양방향 간선을 제거한다.
3.3. 노드삭제
4. hasEdge
4.1. 노드가 존재하는 노드라면
4.2. 반복문을돌려 출발간선에 도착간선이 있는지 확인
4.3. 있으면 true 반환
5. addEdge
5.1. 출발간선에 도착간선추가
5.2. 도착간선에 출발간선 추가
6.removeEdge
6.1. 출발간선의 도착간선 제거
6.2. 도착간선의 출발간선 제거
class Graph {
constructor() {
this.nodes = {};
}
addNode(node) {
this.nodes[node] = this.nodes[node] || [];
}
contains(node) {
if(this.nodes[node]){
return true;
}
else{
return false;
}
}
removeNode(node) {
if(this.nodes[node] === undefined){
return undefined
}
for (let i of this.nodes[node]) {
this.removeEdge(i, node)
}
delete this.nodes[node]
}
hasEdge(fromNode, toNode) {
if(this.nodes[fromNode]){
for(let edge of this.nodes[fromNode]){
if(edge === toNode){
return true
}
}
}
return false
}
addEdge(fromNode, toNode) {
this.nodes[fromNode].push(toNode)
this.nodes[toNode].push(fromNode)
}
removeEdge(fromNode, toNode) {
this.nodes[fromNode].splice(this.nodes[fromNode].indexOf(toNode),1)
this.nodes[toNode].splice(this.nodes[toNode].indexOf(fromNode),1);
}
}