Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

연결리스트를 이용한 무방향 그래프의 구현 완료 #45

Merged
merged 6 commits into from
Aug 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions yoonexample/src/main/java/graph/Graph.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package graph;

/**
* 간단한 그래프 자료구조의 인터페이스
*
* @author dion
*/
public interface Graph {

/**
* 매개변수 fromV와 toV로 전달된 정점을 연결하는 간선을 그래프에 추가합니다.
*
* @param fromV 시작하는 정점
* @param toV 도달하는 정점
*/
void addEdge(Enum<?> fromV, Enum<?> toV);

/**
* 그래프의 간선정보를 반환합니다.
*/
String showGraphEdgeInfo();
}
47 changes: 47 additions & 0 deletions yoonexample/src/main/java/graph/ListGraph.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package graph;

import list.DummyDoublyLinkedList;
import list.List;

public class ListGraph implements Graph {

private final List<Enum<?>>[] vertexes;

public ListGraph(int vertexCount, Class<? extends Enum<?>> clazz) {
Enum<?>[] enumConstants = clazz.getEnumConstants();
int min = Math.min(vertexCount, enumConstants.length);

this.vertexes = new List[min];
for (int i = 0; i < min; i++) {
this.vertexes[i] = new DummyDoublyLinkedList<>();
this.vertexes[i].insert(enumConstants[i]);
}
}

@Override
public void addEdge(Enum<?> fromV, Enum<?> toV) {
vertexes[fromV.ordinal()].insert(toV);
vertexes[toV.ordinal()].insert(fromV);
}

@Override
public String showGraphEdgeInfo() {
StringBuilder sb = new StringBuilder();

for (List<Enum<?>> vertex : vertexes) {
if (vertex.size() > 1) {
for (int i = 0; i < vertex.size(); i++) {
sb.append(vertex.get(i));
if (i == 0) {
sb.append(": ");
} else if (i < vertex.size() - 1) {
sb.append(" ");
}
}
sb.append("\n");
}
}

return sb.toString();
}
}
46 changes: 46 additions & 0 deletions yoonexample/src/test/java/graph/GraphTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package graph;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class GraphTest {

Graph graph;

@BeforeEach
void setUp() {
graph = new ListGraph(5, Point.class);
}

@Test
void 그래프_초기화_테스트() {
assertThat(graph).isNotNull();
}

@Test
void 방향_그래프_정점_연결_테스트() {
graph.addEdge(Point.A, Point.B);
assertThat(graph.showGraphEdgeInfo()).isEqualTo("A: B\nB: A\n");

graph.addEdge(Point.A, Point.D);
assertThat(graph.showGraphEdgeInfo()).isEqualTo("A: B D\nB: A\nD: A\n");

graph.addEdge(Point.B, Point.C);
assertThat(graph.showGraphEdgeInfo()).isEqualTo("A: B D\nB: A C\nC: B\nD: A\n");

graph.addEdge(Point.C, Point.D);
assertThat(graph.showGraphEdgeInfo()).isEqualTo("A: B D\nB: A C\nC: B D\nD: A C\n");

graph.addEdge(Point.D, Point.E);
assertThat(graph.showGraphEdgeInfo()).isEqualTo("A: B D\nB: A C\nC: B D\nD: A C E\nE: D\n");

graph.addEdge(Point.E, Point.A);
assertThat(graph.showGraphEdgeInfo()).isEqualTo("A: B D E\nB: A C\nC: B D\nD: A C E\nE: D A\n");
}

private enum Point {
A, B, C, D, E, F, G, H, I, J
}
}