Skip to content

Commit 5ca50a0

Browse files
authored
Merge pull request #45 from Data-Structure-Study/yoonexample
연결리스트를 이용한 무방향 그래프의 구현 완료
2 parents a749a1d + 975eeb0 commit 5ca50a0

File tree

3 files changed

+115
-0
lines changed

3 files changed

+115
-0
lines changed
+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package graph;
2+
3+
/**
4+
* 간단한 그래프 자료구조의 인터페이스
5+
*
6+
* @author dion
7+
*/
8+
public interface Graph {
9+
10+
/**
11+
* 매개변수 fromV와 toV로 전달된 정점을 연결하는 간선을 그래프에 추가합니다.
12+
*
13+
* @param fromV 시작하는 정점
14+
* @param toV 도달하는 정점
15+
*/
16+
void addEdge(Enum<?> fromV, Enum<?> toV);
17+
18+
/**
19+
* 그래프의 간선정보를 반환합니다.
20+
*/
21+
String showGraphEdgeInfo();
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package graph;
2+
3+
import list.DummyDoublyLinkedList;
4+
import list.List;
5+
6+
public class ListGraph implements Graph {
7+
8+
private final List<Enum<?>>[] vertexes;
9+
10+
public ListGraph(int vertexCount, Class<? extends Enum<?>> clazz) {
11+
Enum<?>[] enumConstants = clazz.getEnumConstants();
12+
int min = Math.min(vertexCount, enumConstants.length);
13+
14+
this.vertexes = new List[min];
15+
for (int i = 0; i < min; i++) {
16+
this.vertexes[i] = new DummyDoublyLinkedList<>();
17+
this.vertexes[i].insert(enumConstants[i]);
18+
}
19+
}
20+
21+
@Override
22+
public void addEdge(Enum<?> fromV, Enum<?> toV) {
23+
vertexes[fromV.ordinal()].insert(toV);
24+
vertexes[toV.ordinal()].insert(fromV);
25+
}
26+
27+
@Override
28+
public String showGraphEdgeInfo() {
29+
StringBuilder sb = new StringBuilder();
30+
31+
for (List<Enum<?>> vertex : vertexes) {
32+
if (vertex.size() > 1) {
33+
for (int i = 0; i < vertex.size(); i++) {
34+
sb.append(vertex.get(i));
35+
if (i == 0) {
36+
sb.append(": ");
37+
} else if (i < vertex.size() - 1) {
38+
sb.append(" ");
39+
}
40+
}
41+
sb.append("\n");
42+
}
43+
}
44+
45+
return sb.toString();
46+
}
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package graph;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import org.junit.jupiter.api.BeforeEach;
6+
import org.junit.jupiter.api.Test;
7+
8+
class GraphTest {
9+
10+
Graph graph;
11+
12+
@BeforeEach
13+
void setUp() {
14+
graph = new ListGraph(5, Point.class);
15+
}
16+
17+
@Test
18+
void 그래프_초기화_테스트() {
19+
assertThat(graph).isNotNull();
20+
}
21+
22+
@Test
23+
void 방향_그래프_정점_연결_테스트() {
24+
graph.addEdge(Point.A, Point.B);
25+
assertThat(graph.showGraphEdgeInfo()).isEqualTo("A: B\nB: A\n");
26+
27+
graph.addEdge(Point.A, Point.D);
28+
assertThat(graph.showGraphEdgeInfo()).isEqualTo("A: B D\nB: A\nD: A\n");
29+
30+
graph.addEdge(Point.B, Point.C);
31+
assertThat(graph.showGraphEdgeInfo()).isEqualTo("A: B D\nB: A C\nC: B\nD: A\n");
32+
33+
graph.addEdge(Point.C, Point.D);
34+
assertThat(graph.showGraphEdgeInfo()).isEqualTo("A: B D\nB: A C\nC: B D\nD: A C\n");
35+
36+
graph.addEdge(Point.D, Point.E);
37+
assertThat(graph.showGraphEdgeInfo()).isEqualTo("A: B D\nB: A C\nC: B D\nD: A C E\nE: D\n");
38+
39+
graph.addEdge(Point.E, Point.A);
40+
assertThat(graph.showGraphEdgeInfo()).isEqualTo("A: B D E\nB: A C\nC: B D\nD: A C E\nE: D A\n");
41+
}
42+
43+
private enum Point {
44+
A, B, C, D, E, F, G, H, I, J
45+
}
46+
}

0 commit comments

Comments
 (0)