[Algorithm] ๐Ÿข๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(Depth First Search, DFS)

HaJingJingยท2021๋…„ 5์›” 20์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
46/119

์„ค๋ช…

Depth First Search(๊นŠ์ด์šฐ์„ ํƒ์ƒ‰)์œผ๋กœ, ๋ฃจํŠธ์—์„œ ์‹œ์ž‘ํ•ด์„œ ํ•ด๋‹น ๋ถ„๊ธฐ๋ฅผ ์ตœ๋Œ€ํ•œ ๊นŠ์ˆ™ํžˆ ํƒ์ƒ‰ ํ›„ ๋‹ค์Œ ๋ถ„๊ธฐ๋กœ ๋„˜์–ด๊ฐ€๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๋ฐฑํŠธ๋ž˜ํ‚น*์— ์‚ฌ์šฉ๋œ๋‹ค.

์ฃผ๋กœ, ์žฌ๊ท€ํ˜ธ์ถœ, ์Šคํƒ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

*๋ฐฑํŠธ๋ž˜ํ‚น : ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ชจ๋“  ์กฐํ•ฉ์˜ ์ˆ˜๋ฅผ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์œผ๋กœ, ๊ฐ€์ง€์น˜๊ธฐ๋ฅผ ํ†ตํ•ด ๊ฐ€๋„ ๋˜์ง€ ์•Š์€ ๋ฃจํŠธ๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ํƒ์ƒ‰ํ•˜๋Š” ๊ธฐ๋ฒ•

DFS ์˜ˆ์‹œ

Q. 0,1,2,3,4๊ฐ€ ์ด๋ ‡๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด DFS์— ๋”ฐ๋ฅธ ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ๊ตฌํ•˜๋ผ

(1) 0๊ณผ ์—ฐ๊ฒฐ๋œ 1,2,4 ์ค‘ ์ œ์ผ ์ž‘์€ 1์— ๋ฐฉ๋ฌธํ•จ
โ†’ [0, 1]

(2) 1๊ณผ ์—ฐ๊ฒฐ๋œ 0,2 ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ 2๋ฅผ ๋ฐฉ๋ฌธํ•จ
โ†’ [0,1,2]

(3) 2์™€ ์—ฐ๊ฒฐ๋œ 0,1,3 ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ 3์„ ๋ฐฉ๋ฌธํ•จ
โ†’ [0,1,2,3]

(4) 3๊ณผ ์—ฐ๊ฒฐ๋œ 2,4 ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ 4๋ฅผ ๋ฐฉ๋ฌธํ•จ
โ†’ [0,1,2,3,4]

(5) 3์œผ๋กœ backtracking, 2๋กœ backtracking ...

๊ตฌํ˜„ ์ฝ”๋“œ

์žฌ๊ท€+์ธ์ ‘ํ–‰๋ ฌ

boolean[] visited = new boolean[100];
int[][] graph = new int[100][100]; 
//graph[x][y] == 1 ์ด๋ฉด, x์™€ y๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ

void DFS(int v) {
	visited[v] = true;
	System.out.print(v+" ");

	for(int i=1; i<graph[v].length; i++) {
		if(graph[v][i] == 1 && !visited[i])
			dfs(i);
	}
}

์žฌ๊ท€+์ธ์ ‘๋ฆฌ์ŠคํŠธ

LinkedList<Integer>[] adjList = new LinkedList[100];
// ์ด๋ฏธ ๋ชจ๋‘ ์—ฐ๊ฒฐ๋œ ์ƒํƒœ๋ผ๊ณ  ๊ฐ€์ •
boolean[] visited = new boolean[100];
void DFS(int v) {
	visited[v] = true;
	System.out.print(v+" ");

	Iterator<Integer> iter = adjList[v].listIterator();
	while(iter.hasNext()){
		int w = iter.next();
		if(!visited[w])
			dfs(w);
	}
}

์Šคํƒ

boolean[] visited = new boolean[100];
int[][] graph = new int[100][100]; 
//graph[x][y] == 1 ์ด๋ฉด, x์™€ y๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ

void DFS(int start){
	Stack<Integer> stack = new Stack<Integer>();
	stack.push(start);
	
	while(!stack.isEmpty()){
		int v = stack.pop();
		if(!visited[v]){
			visited[v] = true;
			System.out.println(v+" ");
			for(int i=0; i<graph[v].length; i++){
				if(!visited[i])
					stack.push(i);
			}
		}
	}
}

์‹œ๊ฐ„ ๋ณต์žก๋„

์ธ์ ‘๋ฆฌ์ŠคํŠธ : O(V+E)
์ธ์ ‘ํ–‰๋ ฌ : O(V2V^2)

๋‹จ์ 

  • ๋‹จ์ˆœ ๊ฒ€์ƒ‰ ์†๋„๋Š” BFS ๋ณด๋‹ค ๋Š๋ฆผ
  • ์ •๋‹ต์„ ๊ตฌํ•˜๋ฉด ํƒ์ƒ‰์ด ์ข…๋ฃŒ๋˜๋ฏ€๋กœ, ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Œ

์žฅ์ 

  • ํ˜„์žฌ ๋ถ„๊ธฐ์˜ ๋…ธ๋“œ๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋˜๋ฏ€๋กœ, ์ €์žฅ ๊ณต๊ฐ„์ด ๋น„๊ต์  ์ ์Œ
  • ๊ตฌํ˜„์ด BFS๋ณด๋‹ค ๊ฐ„๋‹จํ•จ
profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€