정점(node) 와 그 정점을 연결하는 간선( edge)로 이루어진 자료구조
그래프 탐색의 종류 2가지 : DFS, BFS
그래프의 시작 노드에서 출발하여 탐색할 한 쪽 분기를 정하여 최대깊이 까지 탐색을 마친 후 다른 쪽 분기로 이동하여 다시 탐색하는 알고리즘
완전 탐색 기법 중 하나
완전 탐색 기법
static Set<String> visited = new HashSet<>();
static void dfs(Map<String, List<String>> graph, String current) {
// *---------------------------------------*
// 그래프를 방문하며 처리해야할 일을 여기서 한다
// (예시)
// if (current == value) {
// << 현재 노드가 특정 값을 만족할 때 해야할 일 >>
// return current;
// }
// *---------------------------------------*
visited.add(current);
for (String v : graph.get(current)) {
if (!visited.contains(v)) {
dfs(graph, v);
}
}
}
### 📌 개념
public static void makeGraph() {
graph.put(0, Arrays.asList(1, 3, 6));
graph.put(1, Arrays.asList(0, 3));
graph.put(2, Arrays.asList(3));
graph.put(3, Arrays.asList(0, 1, 2, 7));
graph.put(4, Arrays.asList(5));
graph.put(5, Arrays.asList(4, 6, 7));
graph.put(6, Arrays.asList(0, 5));
graph.put(7, Arrays.asList(3, 5));
}
Set<String> bfs(Map<String, List<String>> graph, String start) {
Set<String> visited = new HashSet<>();
visited.add(start);
Queue<String> queue = new ArrayDeque<>();
queue.add(start);
while (!queue.isEmpty()) {
String current = queue.remove();
// *---------------------------------------*
// 그래프를 방문하며 처리해야할 일을 여기서 한다
// (예시)
// if (current == value) {
// << 현재 노드가 특정 값을 만족할 때 해야할 일 >>
// return current;
// }
// *---------------------------------------*
for (String v : graph.get(current)) {
if (!visited.contains(v)) {
visited.add(v);
queue.add(v);
}
}
}
return visited;
}
int binarySearch2(int key, int low, int high) {
int mid;
while(low <= high) {
mid = (low + high) / 2;
if(key == arr[mid]) {
return mid;
} else if(key < arr[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1; // 탐색 실패
}
int binarySearch1(int key, int low, int high) {
int mid;
if(low <= high) {
mid = (low + high) / 2;
if(key == arr[mid]) { // 탐색 성공
return mid;
} else if(key < arr[mid]) {
// 왼쪽 부분 arr[0]부터 arr[mid-1]에서의 탐색
return binarySearch1(key ,low, mid-1);
} else {
// 오른쪽 부분 - arr[mid+1]부터 arr[high]에서의 탐색
return binarySearch1(key, mid+1, high);
}
}
return -1; // 탐색 실패
}