CS log

DFS & BFS 본문

CS/Algorithm

DFS & BFS

sj.cath 2024. 8. 14. 15:59

1. DFS/BFS 기초

  • 공통점
    • 그래프를 끝까지 탐색하기 위한 알고리즘이다 (완전탐색)
    • to_visit, visited 리스트를 관리하는 것이 핵심이다!
  • 차이점
    • 탐색 순서 차이
    • DFS는 상하로 우선 탐색, BFS는 좌우로 우선 탐색
    • 구현상의 차이점 : to_visit을 관리하고자 DFS는 스택, BFS는 큐(deque)를 사용
  • codes overview
def dfs(graph, start_node) : 
    to_visit, visted = list(), list() # stack으로 관리
    to_visit.append(start_node)
    
    while to_visit :
    	node = to_visit.pop()
        
        if node not in visited :
        	visited.append(node)
            	to_visit.extend(graph[node]) # 현재 노드 node와 연결된 모든 이웃 노드를 to_visit 스택에 추가
            
    return visited

 

from collections import deque
def bfs(graph, start_node) :
  to_visit, visited = deque(), [] # queue로 관리
  to_visit.append(start_node)
    
    while to_visit :
    	node = to_visit.popleft()
        
        if node not in visited :
        	visited.append(node)
            	to_visit.extend(graph[node])
            
    return visited

 

2. DFS & BFS 변형

1) 지도를 사용하는 경우

def dfs(road, n, m) :
   to_visit, visited = [], []
   to_visit.append((n,m))
    
    cnt = 0
    while to_visit :
    	n,m = to_visit.pop()
        if (n,m) not in visited :
            visited.append((n,m))
            road[n][m] = 0
            cnt+=1
            for dn,dm in [(+1,0), (-1,0), (0,+1), (0,-1)] :
            	if 0<= (n+dn) < N and 0<=(m+dm) <M and road[n+dn][m+dm] == 1 :
                	to_visit.append((n+dn, m+dm))
   return cnt

 

 

2) global visited

def dfs(road, n, m) :
   to_visit = []
   to_visit.append((n,m))
    
    cnt = 0
    while to_visit :
    	n,m = to_visit.pop()
        if road[n][m] == 1 :
            road[n][m] = 0	# visited list 역할. 방문 처리
            cnt += 1
            for dn,dm in [(+1,0), (-1,0), (0,+1), (0,-1)] :
            	if 0<= (n+dn) < N and 0<=(m+dm) <M and road[n+dn][m+dm] == 1 :
                	to_visit.append((n+dn, m+dm))
                    
    return cnt

 

3) DFS & BFS 확장

백준 1182 - 부분 수열의 합을 dfs로 풀이!

n_nums, target = map(int, input().split())
nums = list(map(int, input().split()))

cnt = 0

def dfs(idx,sum) :
    global cnt
    if idx >= n_nums : # 재귀함수의 종료 조건 ; 리스트 끝에 도달하면 중지
       return
    sum += nums[idx]
    if sum == target :
       cnt += 1
    
    dfs(idx+1, sum)
    dfs(idx+1, sum-nums[idx])
    
dfs(0,0) # idx = 0, sum = 0인 처음의 상태에서 시작
print(cnt)

 

'CS > Algorithm' 카테고리의 다른 글

[백준/python] 11724 : 연결요소의 개수  (0) 2024.08.18
기초 자료구조  (0) 2024.08.14
[백준/python] 1182번 : 부분 수열의 합  (0) 2024.08.11
[백준/python] 4779번 : 칸토어 집합  (0) 2024.08.09
재귀 recursive function  (0) 2024.08.09