일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
31 |
Tags
- 파이썬
- 브루투포스
- 1일1솔
- appendleft
- JPA
- unity
- BFS
- 누적합
- 인프런
- deque
- 백준
- popleft
- 합 구하기
- 우선순위큐
- DP
- 그리디 알고리즘
- pypy3
- 프로그래머스
- C#강의
- 소수찾기
- 소수판별
- 완전탐색
- Python
- 연관관계
- mvc
- spring
- LCM
- Java
- c#
- python3
Archives
- Today
- Total
jae_coding
(백준 알고리즘 문제풀이) 1260번 BFS, DFS 본문
반응형
문제
문제 접근
- DFS
- 모든 노드를 방문하고 싶을 때 사용한다.
- Root node를 시작으로 다음 분기까지 넘어가기 전에 완전히 탐색하는 것!!
- 한 방향으로 계속 탐색을 하다가 더 이상 탐색할 수 없을 때, 갈림길로 돌아와 완전히 탐색한다.
- 어떤 노드를 방문했었는지 여부를 반드시 확인해야한다. - BFS
- Root node를 시작해서 인접한 노드를 먼저 탐색하는 방법
- 시작점에서 가장 가까운 점을 먼저 방문한다 -> 최단 경로나 임의의 경로를 찾고 싶을 때 사용한다
- 재귀적으로 동작하지 않으며, queue를 이용하여 반복적 형태로 구현한다.
코드
import sys
from collections import deque
# N: 정점의 개수, M: 간선의 개수, V: 탐색을 시작할 정점의 번호
N, M, V = map(int, sys.stdin.readline().split())
# 0번 인덱스는 무시하기 위해서 N이 아닌 N+1 이용
# 탐색했는지 여부를 판단하기 위해서 check list를 활용
# DFS check list
checked = [0] * (N + 1)
# BFS check list
checked2 = [0] * (N + 1)
# 입력받는 그래프 만들기
graph = [[0] * (N + 1) for _ in range(N + 1)]
for i in range(M):
x, y = map(int, sys.stdin.readline().split())
graph[x][y] = 1
graph[y][x] = 1
# print(graph)
# for i in graph:
# print(i)
# DFS 기능 구현
def dfs(V):
# print(checked)
checked[V] = 1
print(V, end=" ")
for i in range(1, N+1):
if checked[i] == 0 and graph[V][i] == 1:
dfs(i)
# BFS 기능 구현
def bfs(V):
q = deque()
q.append(V)
checked2[V] = 1
while q:
V = q.popleft()
print(V, end=" ")
for i in range(1, N+1):
if checked2[i] == 0 and graph[V][i] == 1:
q.append(i)
checked2[i] = 1
# 실행
dfs(V)
print("")
bfs(V)
느낀점
기초적인 알고리즘 (깊이 우선 탐색, 너비 우선 탐색)이지만 기초적인 것에 대한 개념을 복습하는 것이 중요하다는 것을 깨달을 수 있었다. 그리고 다양한 코딩 문제를 풀기 위해서는 아주 중요한 알고리즘이라고 생각한다.
반응형
'알고리즘 문제 > 백준' 카테고리의 다른 글
(백준 알고리즘 문제풀이) 2846번 오르막길 (0) | 2022.07.12 |
---|---|
(백준 알고리즘 문제풀이) 1655번 가운데를 말해요 (0) | 2022.07.10 |
(백준 알고리즘 문제풀이) 1699번 제곱수의 합 (0) | 2022.07.07 |
(백준 알고리즘 문제풀이) 11054번 가장 긴 바이토닉 부분 수열 (0) | 2022.07.07 |
(백준 알고리즘 문제풀이) 14003번 가장 긴 증가하는 부분 수열 5 (0) | 2022.07.07 |
Comments