Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- TypeORM
- 타입스크립트
- Deep Dive
- concurrency limit
- NestJS
- Dev-Matching
- 검색
- api 비동기처리
- AWS
- 스프링부트
- redis
- 프론트엔드 과제
- 음악 url 파일 다운로드
- oauth
- 유효시간 설정 url
- bucket4j
- 모던 자바스크립트
- 프론트엔드
- 파일 url
- 프리코스
- 딥다이브
- 자바스크립트
- this
- compateto
- api 요청 수 제한
- 우아한테크코스
- 코멘토 #코멘토실무PT #실무PT후기 #실무강의 #리액트강의 #웹프로그래밍 #react #웹개발실무
- invalid_grant
- 우아한 테크코스
- 프로그래머스
Archives
- Today
- Total
개발 알다가도 모르겠네요
DFS (깊이 우선 탐색) 를 간단하게 알아보자. 본문
728x90
DFS(Depth First Search)를 간단하게 설명하면?
그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘!
한 방향으로 갈 수 있을 때까지 계속 가다가 더 이상 갈 수없게 되면 다른 방향으로 다시 탐색을 진행하는 방식입니다.
스택이나 재귀함수를 이용하여 구현합니다.
- 탐색 시작 노드를 스택에 삽입하고 방문 처리를 합니다.
- 스택의 최상단 노드에 방문하지 않은 인접한 노드가 있다면 그 노드를 스택에 넣고 방문 처리합니다.
- 방문하지 않은 인접노드가 없다면 스택에서 최상단 노드를 꺼냅니다.
- 위의 과정을 수행할 수 없을 때까지 반복합니다.
DFS 구현 과정
인접리스트
import java.util.*;
public class Main {
public static boolean visited[]
public static int v;
public static int e;
public static ArrayList<ArrayList<Integer>> graph;
public static void dfs(int x) {
visited[x] = true;
System.out.print(x+" ");
for(int i=0; i<arr.get(x).size(); i++) { //행
int y = graph.get(x).get(i); //열
if(!visited[y]) //방문하지 않았으면 dfs.
dfs(y);
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
v = scan.nextInt();
e = scan.nextInt();
graph = new ArrayList(v+1); //정점이 1부터 시작한다고 가정. 배열은 인덱스가 0부터 시작이므로 +1
visited = new boolean[v+1]; //정점이 1부터 시작한다고 가정. 배열은 인덱스가 0부터 시작이므로 +1
for(int i=0; i<v+1; i++)
graph.add(new ArrayList());
for(int i=0; i<e; i++) {
int t1 = scan.nextInt();
int t2 = scan.nextInt();
graph.get(t1).add(t2); //무방향 그래프의 특징.
graph.get(t2).add(t1);
}
dfs(1);
}
}
인접 행렬
import java.util.*;
public class Main {
public static boolean visited[];
public static int v; //정점
public static int e; //간선
public static int[][] graph; //인접행렬
public static void dfs(int i) {
visited[i] = true;
System.out.print(i+" ");
for(int j=1; j<v+1; j++) { //정점이 1부터 시작한다고 가정. 배열은 인덱스가 0부터 시작이므로 +1
if(visited[j]==false && graph[i][j]==1) //방문하지 않았고, 값이 1일때 dfs.
dfs(j);
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
v = scan.nextInt();
e = scan.nextInt();
graph = new int[v+1][v+1]; //정점이 1부터 시작한다고 가정. 배열은 인덱스가 0부터 시작이므로 +1
visited = new boolean[v+1]; //정점이 1부터 시작한다고 가정. 배열은 인덱스가 0부터 시작이므로 +1
for(int i=0; i<e; i++) { //간선의 개수만큼 반복
int t1 = scan.nextInt();
int t2 = scan.nextInt();
graph[t1][t2] = 1; //무방향 그래프의 특징.
graph[t2][t1] = 1;
}
dfs(1);
}
}
시간 복잡도
V: 정점
E: 간선
- 인접 리스트 : O(V + E)
- 인접 행렬 : O(N^2)
'자료구조 > 그래프' 카테고리의 다른 글
이분 그래프 (Bipartite Graph) 를 간단하게 알아보자. (0) | 2021.01.17 |
---|---|
DFS & BFS 특 (0) | 2021.01.15 |
BFS (너비 우선 탐색) 를 간단하게 알아보자. (0) | 2021.01.15 |