𝙂𝙧𝙖π™₯𝙝 π™Žπ™šπ™–π™§π™˜π™

uuuouuoΒ·2022λ…„ 7μ›” 22일
0
post-thumbnail

κ·Έλž˜ν”„ 탐색


  • κ·Έλž˜ν”„ 탐색은 λΉ„μ„ ν˜•κ΅¬μ‘°μΈ κ·Έλž˜ν”„λ‘œ ν‘œν˜„λœ λͺ¨λ“  자료(정점)λ₯Ό 빠짐없이 νƒμƒ‰ν•˜λŠ” 것

μ’…λ₯˜

  • 깊이 μš°μ„  탐색(Depth Frist Search, DFS)
  • λ„ˆλΉ„ μš°μ„  탐색(Breadth First Search, BFS)

DFS (깊이 μš°μ„  탐색)


  • μ‹œμž‘ 정점을 μ‹œμž‘μœΌλ‘œ ν•œ λ°©ν–₯으둜 갈 수 μžˆλŠ” κ²½λ‘œκ°€ μžˆλŠ” κ³³κΉŒμ§€ 깊이 탐색
  • 더이상 갈 곳이 μ—†λ‹€λ©΄, κ°€μž₯ λ§ˆμ§€λ§‰μ— λ§Œλ‚¬λ˜ 갈림길 간선이 μžˆλŠ” μ •μ μœΌλ‘œ λŒμ•„κ°€ 같은 λ°©μ‹μœΌλ‘œ λ‹€μ‹œ 탐색
  • κ°€μž₯ λ§ˆμ§€λ§‰μ— λ§Œλ‚¬λ˜ 갈림길의 μ •μ μœΌλ‘œ λ˜λŒμ•„κ°€μ„œ λ‹€μ‹œ 깊이 μš°μ„  탐색을 λ°˜λ³΅ν•΄μ•Ό ν•˜λ―€λ‘œ ν›„μž…μ„ μΆœ(LIFO) ꡬ쑰의 μŠ€νƒ μ‚¬μš©
  • μ‹œκ°„ λ³΅μž‘λ„
    • (N: μ •μ μ˜ 수, E: κ°„μ„ μ˜ 수)
    • 인접 리슀트 κ΅¬ν˜„: O(N+E)
    • 인접 ν–‰λ ¬ κ΅¬ν˜„: O(N^2)

DFS μ•Œκ³ λ¦¬μ¦˜ - μž¬κ·€

static int N = 5;
static int[][] matrix = new int[N][N];
static boolean[] visited = new boolean[N];

static void dfs(int node) {
	visited[node] = true; // 방문 체크
	
	for(int next = 0; next < N; next++) {
    	// λ°©λ¬Έ ν–ˆκ±°λ‚˜, 간선이 μ—†μœΌλ©΄ λ‹€μŒμœΌλ‘œ λ„˜μ–΄κ°
		if(visited[next] || matrix[node][next] == 0) 
			continue;
		dfs(next);
	}
}

DFS μ•Œκ³ λ¦¬μ¦˜ - 반볡문 (μŠ€νƒ 이용)

  • input μ‚¬μ΄μ¦ˆκ°€ 클 경우 이용
  • stack을 μ΄μš©ν•˜λ©΄ μ‹œμž‘ 정점과 λ¨Ό 정점 λ¨Όμ € 확인
static int N = 5;
static int[][] matrix = new int[N][N];

static void dfs(int node) {
	boolean[] visited = new boolean[N];
	Stack<Integer> st = new Stack<>();
	st.push(node); // μ‹œμž‘ 정점
	
	while(!st.isEmpty()) {
		int cur = st.pop();
		if(visited[cur]) continue; // 방문 체크
		
		visited[cur] = true; // μ•ˆν–ˆλ‹€λ©΄ λ°©λ¬Έ
		
		for(int next = 0; next < N; next++) {
        	// λ°©λ¬Έ ν–ˆκ±°λ‚˜, 간선이 μ—†μœΌλ©΄ λ‹€μŒμœΌλ‘œ λ„˜μ–΄κ°
			if(visited[next] || matrix[node][next] == 0) 
				continue;
			st.push(next);
		}
		
	}
	
}

BFS (λ„ˆλΉ„ μš°μ„  탐색)


  • 탐색 μ‹œμž‘μ μ˜ μΈμ ‘ν•œ 정점듀을 λ¨Όμ € λͺ¨λ‘ μ°¨λ‘€λ‘œ λ°©λ¬Έ
  • μ‹œμž‘μ μ˜ 인접 정점을 λ‹€μ‹œ μ‹œμž‘μ μœΌλ‘œ λ‹€μ‹œ μΈμ ‘ν•œ 정점듀 μ°¨λ‘€λ‘œ λ°©λ¬Έ
  • μΈμ ‘ν•œ 정점듀에 λŒ€ν•΄ νƒμƒ‰ν•œ ν›„, μ°¨λ‘€λ‘œ λ‹€μ‹œ λ„ˆλΉ„ μš°μ„  탐색 진행해야 ν•˜λ―€λ‘œ μ„ μž…μ„ μΆœ(FIFO) ν˜•νƒœμ˜ 자료ꡬ쑰인 큐 이용
  • κ°€μ€‘μΉ˜κ°€ μ—†λŠ” κ·Έλž˜ν”„μ—μ„œ BFS둜 μ΅œλ‹¨ 경둜 κ΅¬ν•˜κΈ° κ°€λŠ₯
  • μ‹œκ°„ λ³΅μž‘λ„
    • (N: μ •μ μ˜ 수, E: κ°„μ„ μ˜ 수)
    • 인접 리슀트 κ΅¬ν˜„: O(N+E)
    • 인접 ν–‰λ ¬ κ΅¬ν˜„: O(N^2)

BFS μ•Œκ³ λ¦¬μ¦˜

static int N = 5;
static int[][] matrix = new int[N][N];

static void dfs(int node) {
	boolean[] visited = new boolean[N];
	Queue<Integer> q = new LinkedList<>();
	q.offer(node);
	
	while(!q.isEmpty()) {
		int cur = q.poll();
		
		for(int next = 0; next < N; next++) {
			if(visited[next] || matrix[node][next] == 0) 
				continue;
			// μ€‘λ³΅λ˜μ„œ λ“€μ–΄κ°€λŠ” 경우 막기 μœ„ν•΄
			// 큐 μ‚½μž… μ‹œ λ°©λ¬Έ 처리
			visited[cur] = true; 
			q.offer(next);
		}
		
	}
	
}

0개의 λŒ“κΈ€