Skip to content

Commit 876f64a

Browse files
authored
Merge pull request #47 from Data-Structure-Study/yoonexample
DFS BFS 구현
2 parents 91839fa + 1c8a177 commit 876f64a

File tree

3 files changed

+115
-0
lines changed

3 files changed

+115
-0
lines changed

yoonexample/src/main/java/graph/Graph.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,24 @@ public interface Graph {
1717

1818
/**
1919
* 그래프의 간선정보를 반환합니다.
20+
*
21+
* @return 그래프의 간선정보
2022
*/
2123
String showGraphEdgeInfo();
24+
25+
/**
26+
* startV를 기점으로 DFS를 수행한 결과를 반환합니다.
27+
*
28+
* @param startV DFS를 시작하는 정점
29+
* @return startV를 기점으로 하는 DFS 결과
30+
*/
31+
String depthFirstSearch(Enum<?> startV);
32+
33+
/**
34+
* startV를 기점으로 BFS를 수행한 결과를 반환합니다.
35+
*
36+
* @param startV BFS를 시작하는 정점
37+
* @return startV를 기점으로 하는 BFS 결과
38+
*/
39+
String breadthFirstSearch(Enum<?> startV);
2240
}

yoonexample/src/main/java/graph/ListGraph.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package graph;
22

3+
import java.util.StringJoiner;
34
import list.DummyDoublyLinkedList;
45
import list.List;
6+
import queue.LinkedListQueue;
7+
import queue.Queue;
8+
import stack.ListStack;
9+
import stack.Stack;
510

611
public class ListGraph implements Graph {
712

@@ -44,4 +49,64 @@ public String showGraphEdgeInfo() {
4449

4550
return sb.toString();
4651
}
52+
53+
@Override
54+
public String depthFirstSearch(Enum<?> startV) {
55+
boolean[] visited = new boolean[vertices.length];
56+
StringJoiner sj = new StringJoiner(" ");
57+
Stack<Enum<?>> vertexStack = new ListStack<>();
58+
vertexStack.push(startV);
59+
60+
while (!vertexStack.isEmpty()) {
61+
Enum<?> visitV = vertexStack.pop();
62+
63+
if (visitVertex(visited, visitV)) {
64+
sj.add(visitV.toString());
65+
}
66+
List<Enum<?>> vertexList = vertices[visitV.ordinal()];
67+
for (int i = 0; i < vertexList.size(); i++) {
68+
Enum<?> vertex = vertexList.get(i);
69+
if (!visited[vertex.ordinal()]) {
70+
vertexStack.push(vertex);
71+
}
72+
}
73+
}
74+
75+
return sj.toString();
76+
}
77+
78+
@Override
79+
public String breadthFirstSearch(Enum<?> startV) {
80+
boolean[] visited = new boolean[vertices.length];
81+
StringJoiner sj = new StringJoiner(" ");
82+
Queue<Enum<?>> vertexQueue = new LinkedListQueue<>();
83+
vertexQueue.enqueue(startV);
84+
85+
while (!vertexQueue.isEmpty()) {
86+
Enum<?> visitV = vertexQueue.dequeue();
87+
88+
if (visitVertex(visited, visitV)) {
89+
sj.add(visitV.toString());
90+
}
91+
92+
List<Enum<?>> vertexList = vertices[visitV.ordinal()];
93+
for (int i = 0; i < vertexList.size(); i++) {
94+
Enum<?> vertex = vertexList.get(i);
95+
if (!visited[vertex.ordinal()]) {
96+
vertexQueue.enqueue(vertex);
97+
}
98+
}
99+
100+
}
101+
102+
return sj.toString();
103+
}
104+
105+
private boolean visitVertex(boolean[] visited, Enum<?> vertex) {
106+
if (visited[vertex.ordinal()]) {
107+
return false;
108+
}
109+
visited[vertex.ordinal()] = true;
110+
return true;
111+
}
47112
}

yoonexample/src/test/java/graph/GraphTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,38 @@ void setUp() {
4040
assertThat(graph.showGraphEdgeInfo()).isEqualTo("A: B D E\nB: A C\nC: B D\nD: A C E\nE: D A\n");
4141
}
4242

43+
@Test
44+
void dfsTest() {
45+
setVertices();
46+
47+
assertThat(graph.depthFirstSearch(Point.A)).isEqualTo("A E D C B");
48+
assertThat(graph.depthFirstSearch(Point.B)).isEqualTo("B E D C A");
49+
assertThat(graph.depthFirstSearch(Point.C)).isEqualTo("C D E B A");
50+
assertThat(graph.depthFirstSearch(Point.D)).isEqualTo("D E B A C");
51+
assertThat(graph.depthFirstSearch(Point.E)).isEqualTo("E D C A B");
52+
}
53+
54+
@Test
55+
void bfsTest() {
56+
setVertices();
57+
58+
assertThat(graph.breadthFirstSearch(Point.A)).isEqualTo("A B C E D");
59+
assertThat(graph.breadthFirstSearch(Point.B)).isEqualTo("B A D E C");
60+
assertThat(graph.breadthFirstSearch(Point.C)).isEqualTo("C A D B E");
61+
assertThat(graph.breadthFirstSearch(Point.D)).isEqualTo("D B C E A");
62+
assertThat(graph.breadthFirstSearch(Point.E)).isEqualTo("E A B D C");
63+
}
64+
65+
private void setVertices() {
66+
graph.addEdge(Point.A, Point.B);
67+
graph.addEdge(Point.A, Point.C);
68+
graph.addEdge(Point.A, Point.E);
69+
graph.addEdge(Point.B, Point.D);
70+
graph.addEdge(Point.B, Point.E);
71+
graph.addEdge(Point.C, Point.D);
72+
graph.addEdge(Point.D, Point.E);
73+
}
74+
4375
private enum Point {
4476
A, B, C, D, E, F, G, H, I, J
4577
}

0 commit comments

Comments
 (0)