코딩테스트
[python] DFS / BFS
ye11
2023. 4. 28. 13:49
탐색 알고리즘을 알기 전에 기본적인 사전 지식들이 조금 필요하다.
1. 스택 : 선입후출(FILO)
2. 큐 : 선입선출 (FIFO)
3. 그래프 개념
그래프는 표현하는 방식에 인접 행렬과 인접 리스트가 있는데, 나는 인접리스트를 이용할 것이다.
1. DFS (Depth - First Search)
: 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘
기본적인 동작 방식
- 탐색 시작노드를 스택에 삽입하고 방문 처리를 한다.
- 스택의 최상단 노드에 방문하지 않는 인접노드가 있으면 그 인접 노드를 스택에 넣고 방문처리를 한다.
- 방분하지 않은 인접노드가 없으면 스택에서 최상단 노드를 꺼낸다
- 2,3번을 반복한다.
빨간색 숫자 순서대로 보면 된다.^^..
재귀 함수를 이용해 코드로 표현해보자
def DFS(garph,v,visited):
visited[v] = True #방문처리
print(v,end=" ")
#현재 노드와 연결된 다른 노드를 방문
for i in graph[v]:
if not visited[i]:
DFS(graph,i,visited)
graph=[
[],
[2,3,8],
[1,7],
[1,4,5],
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]
]
#방문 저장 list
visited = [False]*9
DFS(graph,1,visited) #1번 노드부터 탐색
#출력 결과 : 1 2 7 6 8 3 4 5
2. BFS (Breadth First Search)
: 너비 우선 탐색, 가까운 노드 부터 탐색하는 알고리즘.
깊이 우선 탐색은 최대한 멀리 있는 노드 부터 검색했다면 BFS는 그 반대라고 생각하면 된다.
또 스택을 사용하는 DFS와 달리 큐를 사용한다
기본적인 동작방식
- 탐색 시작 노드를 큐에 삽입 하고 방문처리
- 큐에서 노드를 꺼내 해당 노드의 인접 노드 중 방문하지 않은 노드를 모두 큐에 삽입하고 방문처리
- 2번 반복
bfs도 코드로 구현해보자
def BFS(graph,start,visted):
queue = deque([start])
visited[start] = True
while queue:
v= queue.popleft()
print(v,end=" ")
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
graph=[
[],
[2,3,8],
[1,7],
[1,4,5],
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]
]
#방문 저장 list
visited = [False]*9
BFS(graph,1,visited)
# 1 2 3 8 7 4 5 6
2차원 배열 문제를 풀때 그래프 형태로 생각하면 훨씬 수월하게 풀 수 있다 !
자주 연습하자