1 minute read

πŸ“˜ κ·Έλž˜ν”„λ₯Ό νƒμƒ‰ν•˜λŠ” 방법

κ·Έλž˜ν”„λž€ λ…Έλ“œμ™€ κ°„μ„ μœΌλ‘œ 이루어진 자료ꡬ쑰의 일쒅이닀.
이 κ·Έλž˜ν”„λ₯Ό νƒμƒ‰ν•˜λŠ” λ°©λ²•μ—λŠ” DFS(Depth-First Search) 즉, 깊이 μš°μ„  탐색 방법과 BFS(Breadth-First Search) 즉, 넓이 μš°μ„  탐색 방법이 μžˆλ‹€.
μ΄λ•Œ, κ΅¬ν˜„λ°©λ²•μ€ 인접행렬과 μΈμ ‘λ¦¬μŠ€νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•˜λŠ”λ°, 이에 λŒ€ν•΄ 더 μ•Œμ•„λ³΄κ³  μ‹ΆμœΌλ©΄ λ‹€μŒ 링크λ₯Ό μ‚΄νŽ΄λ³΄κΈΈ λ°”λž€λ‹€.

링크


πŸ“– DFS(깊이 μš°μ„  탐색)

λ‹€μŒμ€ DFS의 μ •μ˜μ΄λ‹€.

κ·Έλž˜ν”„μ—μ„œ κΉŠμ€ 뢀뢄을 μš°μ„ μ μœΌλ‘œ νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜

DFSλŠ” λ‹€μŒ κ·Έλ¦Όκ³Ό 같이 μž‘λ™μ„ ν•˜λ©° 일반적으둜 Stackμ΄λ‚˜ μž¬κ·€ν•¨μˆ˜λ₯Ό 톡해 κ΅¬ν˜„ν•œλ‹€.

img 좜처:https://developer-mac.tistory.com/64

  • 탐색 μ‹œμž‘ λ…Έλ“œλ₯Ό Stack에 μ‚½μž…ν•˜κ³  λ°©λ¬Έ μ²˜λ¦¬ν•œλ‹€.
  • Stack의 top에 μžˆλŠ” λ…Έλ“œμ— μΈμ ‘ν•œ λ…Έλ“œκ°€ ν•˜λ‚˜λΌλ„ 있으면, κ·Έ λ…Έλ“œλ₯Ό λ°©λ¬Έ μ²˜λ¦¬ν•˜κ³ , Stack에 λ„£λŠ”λ‹€.
  • λ°©λ¬Έν•˜μ§€ μ•Šμ€ λ…Έλ“œκ°€ μ—†μœΌλ©΄ Topμ—μ„œ λ…Έλ“œλ₯Ό κΊΌλ‚Έλ‹€.
  • 2와 3을 μˆ˜ν–‰ν•  수 없을 λ–„κΉŒμ§€ λ°˜λ³΅ν•œλ‹€.


πŸ“– κ΅¬ν˜„

πŸ“‹ μž¬κ·€ 호좜

static Stack<Integer> stack = new Stack<>();
static StringBuilder sb = new StringBuilder();
static boolean node[][] = new boolean[n+1][n+1], visited[] = new boolean[n+1];
static void dfs(int v) {
	if(visited[v])
    	return;
	sb.append(v+" ");
	for(int i=1; i<=n; i++)
		if(node[v][i] && !visited[i]) {
			visited[i] = true;
			dfs(i);
		}
}


πŸ“‹ μŠ€νƒ μ‚¬μš©

public static String dfs(int v, boolean node[][]) {
    StringBuilder sb = new StringBuilder();
    Stack<Integer> stack = new Stack<>();
    boolean visited[] = new boolean[n+1];
    stack.add(v);
    int idx;
    while(!stack.isEmpty()) {
        idx = stack.pop();
        if(visited[idx])
            continue;
        visited[idx] = true;
        sb.append(idx+" ");
        for(int i=0; i<n; i++)
            if(node[idx][i] && !visited[i])
                stack.add(i);
    }
    return sb.toString();
}


πŸ“– BFS(넓이 μš°μ„  탐색)

λ‹€μŒμ€ BFS의 μ •μ˜μ΄λ‹€.

κ·Έλž˜ν”„μ—μ„œ κ°€κΉŒμš΄ λ…Έλ“œλΆ€ν„° μš°μ„ μ μœΌλ‘œ νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜

BFSλŠ” λ‹€μŒ κ·Έλ¦Όκ³Ό 같이 μž‘λ™μ„ ν•˜λ©°, 일반적으둜 Queueλ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•œλ‹€.

img 좜처:https://developer-mac.tistory.com/64

  • 탐색 μ‹œμž‘ λ…Έλ“œλ₯Ό Queue에 μ‚½μž…ν•˜κ³  λ°©λ¬Έ μ²˜λ¦¬ν•œλ‹€.
  • Queueμ—μ„œ λ…Έλ“œλ₯Ό κΊΌλ‚Έν›„ 인접 λ…Έλ“œμ€‘ λ°©λ¬Έν•˜μ§€ μ•Šμ€ λ…Έλ“œλ₯Ό λͺ¨λ“œ Queue에 μ‚½μž…ν•˜κ³  λ°©λ¬Έ μ²˜λ¦¬ν•œλ‹€.
  • 2을 μˆ˜ν–‰ν•  수 없을 λ–„κΉŒμ§€ λ°˜λ³΅ν•œλ‹€.


πŸ“‹ 인접 ν–‰λ ¬

void BFS(int V, int start)
{
    queue<int> q;
    bool check[V+1] = {false};
    
    check[start] = true;
    q.push(start);
    
    while(!q.empty())
    {
    	int now = q.front();
        q.pop();
        
        for(int i = 1; i <= V; i++)
        {
        	if(graph[now][i] == 1 && !check[i])
            {
            	check[i] = true;
                q.push(i);
            }
        }
    }
}


πŸ“‹ 인접 리슀트

void BFS(vector<int> *graph,int V, int start)
{
    queue<int> q;
    bool check[V+1] = {false};
    
    check[start] = true;
    q.push(start);
    
    while(!q.empty())
    {
    	int now = q.front();
        q.pop();
        
        for(int i = 0; i < graph[now].size(); i++)
        {
            int next = graph[now][i];
            if(!check[next])
            {
            	check[next] = true;
                q.push(next);
            }
        }
    }
}


πŸ”— κ΄€λ ¨ μ˜ˆμ‹œ

tag:DFS tag:BFS



개인 곡뢀 기둝용 λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
ν‹€λ¦¬κ±°λ‚˜ 였λ₯˜κ°€ μžˆμ„ 경우 μ œλ³΄ν•΄μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.😁