Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
Tags
- DFS
- issue
- 코딩테스트
- cos
- Algorithm
- Flutter
- Python
- 안드로이드스튜디오
- AndroidStudio
- codingtest
- 코테
- android
- BAEKJOON
- 알고리즘
- C++
- django
- DART
- 백준
- DFS와BFS
- cos pro
- cos pro 1급
- 파이썬
- 코드품앗이
- 분할정복
- Vue
- vuejs
- 안드로이드
- 개발
- 동적계획법과최단거리역추적
- 동적계획법
Archives
- Today
- Total
Development Artist
[Baekjoon, Python] 1260번 : DFS와 BFS 본문
728x90
반응형
도입
백준 단계별 풀기 DFS와 BFS 첫 번째 문제이다.
DFS와 BFS
DFS
- Root Node 혹은 다른 임의의 Node에서 이어진 Branch를 완벽하게 탐색하고 다른 이어진 Branch로 넘어가는 방법.
한 방향으로 계속 가서 끝을 마주하면 다른 방향으로 설정해서 마찬가지로 진행.
- Stack 또는 Recursive함수로 구현.
- 시간 복잡도 : 인접 리스트는 $O(V+E)$ 인접 행렬은 $O(V^2)$ // 접점(V), 간선(E)
BFS
- Root Node 혹은 다른 임의의 Node에서 이어진 Branch들의 바로 하나 건너 있는 Node들을 먼저 탐색.
- Queue로 구현
- 시간 복잡도 : 인접 리스트는 $O(V+E)$ 인접 행렬은 $O(V^2)$ // 접점(V), 간선(E)
풀이
1. BFS나 DFS를 구현하기 위해서는, 트리나 그래프 구조가 유용하다. 각 노드끼리 연결 되어있다는 것을 표현하는 방식으로 인접행렬을 채택하였다.
2. DFS는 재귀로, BFS는 큐 자료구조를 사용하여 구현을 하였다. list_visit 배열을 사용하여, 노드의 방문을 기록하였다.
코드
from sys import stdin
def dfs(V):
print(V, end=' ') # 방문한 노드 출력
list_visit[V] = 1 # 방문한 노드 1체크(나 방문했다!)
for i in range(1, var_N + 1):
if list_visit[i] == 0 and inj_matrix[V][i] == 1: # 방문하지 않고, 현재 노드에 인접한 노드 방문시 재귀
dfs(i) # 재귀
def bfs(V):
queue = [V] # queue에 현재 노드 세팅
list_visit[V] = 0 # dfs를 돌았기 때문에, 초기화
while(queue):
V = queue[0] # 현재 큐의 노드 세팅
print(V, end=' ')
del queue[0] # queue[0] 삭제
for i in range(1, var_N + 1):
if list_visit[i] == 1 and inj_matrix[V][i] == 1: # 방문했고 인접노드 방문했으면 큐에 노드 추가하고 방문 초기화
queue.append(i)
list_visit[i] = 0
var_N, var_M, var_V = map(int, stdin.readline().split())
inj_matrix = [[0] * (var_N + 1) for i in range(var_N + 1)] # 인접행렬 생성 (var_N +1 사이즈 만큼 행과 열)
list_visit = [0 for i in range(var_N + 1)] # 방문 정보 리스트 생성 (var_N +1 사이즈 만큼)
for i in range(var_M): # 인접행렬 세팅
x, y = map(int, stdin.readline().split()) # 0 1 1 0
inj_matrix[x][y] = 1 # 1 0 0 1
inj_matrix[y][x] = 1 # 1 0 0 1
# 0 1 1 0
dfs(var_V)
print()
bfs(var_V)
마무리
드디어 DFS, BFS문제를 시작한다. 해당 자료구조에 대해서 예전에 공부한 적이 있어서 로직은 어렵지 않았다. 다만, 어떤 문제를 DFS, BFS로 풀어야 하는지 감을 익히는 것이 중요할 것 같다.
728x90
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
[Beakjoon, Python] 2667번 : 단지번호붙이기 (0) | 2021.03.04 |
---|---|
[Baekjoon, Python] 2606번 : 바이러스 (0) | 2021.03.03 |
[Baekjoon, Python] 13305번 : 주유소 (0) | 2021.03.01 |
[Baekjoon, Python] 1541번 : 잃어버린 괄호 (0) | 2021.02.26 |
[Baekjoon, Python] 11399번 : ATM (0) | 2021.02.25 |
Comments