Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- folium
- 멋재이사자처럼
- paper review
- 인턴10
- 마이온
- 그리디
- likelion
- graphrag
- likelionlikelion
- GIS
- TiL
- BFS
- seaborn
- 마이온컴퍼니
- Python
- 시각화
- 멋사
- DP
- ux·ui디자인
- Rag
- DFS
- intern10
- Join
- 프로젝트
- SQL
- 멋쟁이사자처럼
- 파이썬
- 알고리즘
- GNN
- parklab
Archives
- Today
- Total
지금은마라톤중
[백준] 1260번 DFS와 BFS 본문
그렇습니다. DFS와 BFS입니다..ㅎㅎ
알고리즘을 공부하며 미루고 미루고 미루다가 직면했습니다..하하하
DFS(깊이우선탐색)과 BFS(너비우선탐색)은 코딩테스트에 필수적인 문제 중 하나라고 생각합니다.
알고리즘을 접하지 얼마되지 않았을때 너무 어려워서 외면했는데 최근 기업 공채 코딩테스트를 봐보니 이제는 마주할 때가 되었다고 생각했습니다.
DFS(Depth First Search)와 BFS(Breadth First Search)를 탐색 알고리즘입니다.
데이터 속에서 원하는 데이터를 찾을 때 깊이와 너비를 우선적으로 고려하여 탐색하는 방법으로 차이를 둘 수 있습니다.
- DFS와 BFS 탐색 그래프
DFS | BFS | |
탐색과정 | 현재 노드에서 갈 수 있는 끝까지 방문하여 탐색 | 현재 노드에서 연결된 노드를 방문 후 탐색 |
구현방법 | 스택 or 재귀 구현 | 주로 큐로 구현 |
라이브러리 활용 | X | O (from collections import deque) |
시간복잡도 | 일반적으로 동일, 재귀로 구현 시 DFS보다 BFS가 조금 빠르게 동작 N이 노드의 개수, E가 간선의 개수일 때 인접 리스트: O(N + E) 인접 행렬: O(N^2) |
|
활용 문제 | 백트래킹 | 최단경로 |
1. 그래프의 모든 노드 방문하는 문제 - DFS와 BFS 모두 가능 2. 경로의 특징을 저장하는 문제 - DFS (ex. a-b 이동시 같은 숫자가 있으면 안된다) 3. 최단거리 문제 - BFS |
이제 다시 문제로 돌아와 풀어보겠습니다.
풀이 순서는 다음과 같습니다.
1. 그래프를 맵핑
2. 그래프에서 낮은 숫자부터 탐색하도록 하기 위해 정렬
3. DFS( 재귀 활용)
4. BFS (큐 활용)
n,m,v = map(int, input().split())
graph = [[] for _ in range(n+1)]
# 그래프 맵핑
for _ in range(m):
s,e = map(int, input().split())
graph[s].append(e)
graph[e].append(s)
# 오름차순 정렬
for sub in graph:
if sub :
sub.sort()
# dfs
d_visited = [0]*(n+1)
d_ans = []
def dfs(num, graph, d_visited):
if d_visited[num] == 0:
d_visited[num] = 1
d_ans.append(num)
for i in graph[num]:
dfs(i, graph, d_visited)
dfs(v,graph, d_visited)
# bfs
from collections import deque
queue = deque([v])
b_visited = [0]*(n+1)
b_visited[v] = 1
b_ans = []
def bfs(graph, b_visited):
while queue:
num = queue.popleft()
b_ans.append(num)
for i in graph[num]:
if b_visited[i] == 0:
b_visited[i] = 1
queue.append(i)
bfs(graph, b_visited)
print(*d_ans)
print(*b_ans)
아직 DFS와 BFS의 구현은 미흡하다고 생각합니다.
관련 문제를 계속 풀어보며 연습해야겠다는 생각이 듭니다!!
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
- 참고문서 : 파이썬 알고리즘 인터뷰
'STUDY > Python 알고리즘' 카테고리의 다른 글
[백준] 2667번 단지번호붙이기 (1) | 2024.03.27 |
---|---|
[백준] 2644번 촌수계산 (0) | 2024.03.26 |
[백준] 1012번 유기농배추 (0) | 2024.03.25 |
[백준] 1764번 듣보잡 / set() 집합의 시간복잡도 (1) | 2024.02.27 |
[백준] 1977번 완전제곱수 / input()과 sys.stdin.readline() 차이 (3) | 2022.10.05 |
Comments