남기면 좋잖아
[알고리즘] 탐색 알고리즘 본문
반응형
1. 너비 우선 탐색 (BFS)
개념
너비를 우선으로 하여 탐색을 수행하는 탐색 알고리즘
큐 자료구조를 사용
- 큐에서 하나의 노드를 꺼낸다.
- 해당 노드에 연결된 노드 중 방문하지 않은 노드를 방문하고, 차례대로 큐에 삽입한다.
루트 노드부터 가까운 노드들 탐색이 이루어짐
BFS는 그 자체로는 큰 의미가 없고 다른 알고리즘에 적용한다는 것이 핵심
2. 깊이 우선 탐색 (DFS)
개념
깊이를 우선으로 하여 탐색을 수행하는 탐색 알고리즘
스택 자료구조를 사용
- 스택의 최상단 노드를 확인
- 최상단 노드에게 방문하지 않은 인접 노드가 있다면 그 노드를 스택에 넣고 방문처리.
- 방문하지 않은 노드가 없다면 스택에서 최상단 노드를 뺀다.
재귀 함수 자체가 스택의 원리이기 때문에 짧은 코드로 구현할 수 있음
DFS 또한 그 자체로의 큰 의미가 없다.
문제
DFS와 BFS
출처: 백준알고리즘 1260번 문제
문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
예제 입력
4 5 1
1 2
1 3
1 4
2 4
3 4
출력
1 2 4 3
1 2 3 4
code
from collections import deque
# 입력받기
nums = ["4 5 1",
"1 2",
"1 3",
"1 4",
"2 4",
"3 4"]
# 노드수, 간선수, 시작 정점 받기
nodes, lines, start = map(int, nums.pop(0).split())
# 그래프 그리기
graph = {}
for idx, num in enumerate(nums):
a, b = map(int, num.split())
if not a in graph:
graph[a] = [b]
elif not b in graph[a]:
graph[a].append(b)
if not b in graph:
graph[b] = [a]
elif not a in graph[b]:
graph[b].append(a)
def DFS(graph):
stack = [start]
visited = []
while stack:
node = stack.pop()
if not node in visited:
visited.append(node)
# stack 이기 때문에 reverse True로 작은 수가 제일 끝에 있어야 한다.
stack += sorted(list(set(graph[node]) - set(visited)), reverse=True)
return visited
def BFS(graph):
queue = deque([start])
visited = []
while queue:
node = queue.popleft()
if not node in visited:
visited.append(node)
queue += sorted(list(set(graph[node]) - set(visited)))
return visited
print(graph)
print(DFS(graph))
print(BFS(graph))
반응형
'Programming' 카테고리의 다른 글
git 사용시 Support for password authentication was removed on August 에러 관련 (0) | 2021.10.28 |
---|---|
[github] git merge 혹은 pull로 인해 원치 않은 파일이 삭제되었을때 (0) | 2021.02.03 |
[알고리즘] 동적 프로그래밍 (0) | 2020.10.01 |
[알고리즘] 정렬 알고리즘 (0) | 2020.10.01 |
[알고리즘] Greedy 알고리즘 (0) | 2020.09.23 |
Comments