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 | 29 | 30 |
Tags
- 오블완
- 백엔드 부트캠프
- Spring
- 국비지원교육
- 국비지원
- 내일배움카드
- UXUI기초정복
- Java
- 내일배움캠프
- 디자인챌린지
- 부트캠프
- baekjoon
- Be
- 디자인교육
- 백엔드개발자
- 환급챌린지
- 백엔드
- 오픈챌린지
- 티스토리챌린지
- KDT
- OPENPATH
- UXUIPrimary
- mysql
- 국비지원취업
- 오픈패스
- UXUI챌린지
- 객체지향
- 패스트캠퍼스
- 백준
- 디자인강의
Archives
- Today
- Total
군만두의 IT 공부 일지
[백준] 1260번: DFS와 BFS 본문
✅문제: 1260번
📌개념정리
(1) 깊이 우선 탐색 (DFS, Depth First Search)
- 정의: 그래프 탐색 알고리즘 중 하나로, 현재 노드의 모든 자식을 방문한 뒤 다음 노드로 이동하는 방식으로 탐색함.
- 스택 구조를 활용함 (재귀 함수로 구현 가능).
- 한 노드에서 최대한 깊이 이동한 뒤, 더 이상 이동할 수 없으면 되돌아가서 탐색함.
- 경로 찾기, 네트워크 연결성 확인 문제에 활용됨.
(2) 너비 우선 탐색 (BFS, Breadth First Search)
- 정의: 그래프 탐색 알고리즘 중 하나로, 현재 노드와 인접한 노드들을 모두 방문한 뒤 다음 단계로 이동함.
- 큐 구조를 활용함.
- 같은 깊이에 있는 노드들을 우선적으로 방문함.
- 최단 경로 찾기, 레벨 탐색 문제에 활용됨.
📌문제풀이
주어진 그래프에서 특정 노드 v를 시작점으로 DFS와 BFS를 수행하는 문제임.
- 인접 리스트로 그래프 구성
- 입력받은 간선 정보를 기반으로 그래프를 인접 리스트 형태로 구성함.
- 각 노드에 연결된 이웃 노드들을 저장하고, 방문 순서를 맞추기 위해 정렬함.
- DFS 탐색 수행
- 재귀 호출을 통해 깊이 우선으로 노드를 방문함.
- 현재 노드의 모든 자식 노드를 탐색한 후에 다음 노드로 이동함.
- BFS 탐색 수행
- 큐를 활용하여 너비 우선으로 노드를 방문함.
- 현재 노드와 인접한 모든 노드를 큐에 추가하여 탐색 진행함.
- 결과 출력
- DFS와 BFS 탐색 결과를 각각 출력함.
from sys import stdin, stdout
import collections
input = stdin.read
data = input().split()
n = int(data[0]) # 노드 수
m = int(data[1]) # 간선 수
v = int(data[2]) # 시작 노드
graph = collections.defaultdict(list)
index = 3
for _ in range(m):
x, y = int(data[index]), int(data[index+1])
graph[x].append(y)
graph[y].append(x)
index += 2
for key in graph:
graph[key].sort()
# DFS
def dfs(v, visited=[]):
visited.append(v)
for neighbor in graph[v]:
if neighbor not in visited:
dfs(neighbor, visited)
return visited
# BFS
def bfs(v):
visited = []
queue = collections.deque([v])
while queue:
node = queue.popleft()
if node not in visited:
visited.append(node)
queue.extend([n for n in graph[node] if n not in visited])
return visited
dfs_result = dfs(v)
bfs_result = bfs(v)
stdout.write(' '.join(map(str, dfs_result)) + '\n')
stdout.write(' '.join(map(str, bfs_result)) + '\n')
예제 입출력 1을 확인하면 아래와 같이 알 수 있음.
# 예제 입력 1
4 5 1
1 2
1 3
1 4
2 4
3 4
1. 그래프 구성
- 노드와 간선을 기반으로 인접 리스트 형태로 그래프를 표현함.
{
1: [2, 3, 4],
2: [1, 4],
3: [1, 4],
4: [1, 2, 3]
}
2. DFS 탐색
- 시작 노드 1부터 깊이 우선 탐색
- 방문 순서: 1 → 2 → 4 → 3
- 결과: 1 2 4 3
3. BFS 탐색
- 시작 노드 1부터 너비 우선 탐색
- 방문 순서: 1 → 2 → 3 → 4
- 결과: 1 2 3 4
# 예제 출력 1
1 2 4 3
1 2 3 4
📌후기
- DFS와 BFS의 탐색 방식을 학습하기에 좋았음.
- 인접 리스트 형태로 그래프를 구성하고, 정렬을 통해 작은 노드부터 탐색하도록 코드를 짜면서 해당 알고리즘 공부에 도움이 된 것 같음.
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 9095번: 1, 2, 3 더하기 (0) | 2024.11.25 |
---|---|
[백준] 17952번: 과제는 끝나지 않아! (파이썬) (0) | 2024.11.24 |
[백준] 2293번: 동전 1 (파이썬) (2) | 2024.11.19 |
[백준] 1181번: 단어 정렬 (파이썬) (1) | 2024.11.18 |
[백준] 1263번: 시간 관리 (파이썬) (0) | 2024.11.17 |
Comments