일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 너비우선탐색
- BFS
- 오미크론 자가격리
- 백준
- 사회조사분석사 2급 접수
- 사회조사분석사 2급 필기 공부방법
- 현대엔지니어링 수요예측
- 사회조사분석사 2급 필기 시험시간
- 사이킷런
- 2월공모주
- 백준 알고리즘
- 그리디
- 정렬
- 머신러닝
- 사회조사분석사 2급 필기 요약정리
- DFS
- 공모주 청약
- 사회조사분석사 2급 독학
- 공모주청약
- 알고리즘
- 현대엔지니어링
- 시물레이션
- 벽부수고이동하기 파이썬
- 사회조사분석사 2급 기출문제집
- 사회조사분석사2급실기신청
- 공모주
- 파이썬 정렬
- 사회조사분석사2급실기신청꿀팁
- 사회조사분석사 2급
- 사회조사분석사 2급 공부방법
- Today
- Total
세상을 바꾸는 데이터
(알고리즘 공부점검) [백준 1260번] DFS와 BFS - 파이썬 본문
문제 링크:
https://www.acmicpc.net/problem/1260
풀이 과정:
이 문제는 DFS(깊이 우선 탐색 알고리즘)과 BFS(너비 우선 탐색 알고리즘)의 가장 기초가 되는 문제이다.
DFS에서는 인접 행렬(이웃해 있는 행렬의 값이 모두 일치)을 이용하여, BFS에서는 데크(deque)를 호출해 큐(queue)를 이용하여 문제를 풀었다.
DFS는 스택의 자료 구조와 같다고 말할 수 있는 재귀 함수(자기 자신을 호출하는 함수)를 이용해 문제를 푼다.
BFS는 큐의 자료 구조를 이용해 최단 이동거리 같은 문제에서 자주 쓰인다.
다음 풀이 코드에 있는 함수들은 DFS와 BFS의 기본 메서드 정의 함수인만큼 가장 기초가 되는 함수이다.
이 함수들의 정의를 보면서 DFS와 BFS의 개념에 대해 명확히 알고, 복습해 나가는 것이 이번 나 자신과의 숙제이다.
풀이 코드:
# 1260번 DFS와 BFS
from sys import stdin
from collections import deque
# 입력받기
n, m, v = map(int, stdin.readline().split())
matrix = [[0] * (n+1) for _ in range(n+1)]
# 간선이 연결하는 두 정점의 번호를 인접행렬로 변환
for _ in range(m):
data = list(map(int, stdin.readline().split()))
matrix[data[0]][data[1]] = 1
matrix[data[1]][data[0]] = 1
# dfs 함수
def dfs(start, visited):
visited += [start]
for i in range(len(matrix[start])):
if matrix[start][i] == 1 and i not in visited:
dfs(i, visited)
return visited
# bfs 함수
def bfs(start):
visited = [start]
queue = deque([start])
while queue:
n = queue.popleft()
for i in range(len(matrix[start])):
if matrix[n][i] == 1 and i not in visited:
visited.append(i) queue.append(i)
return visited
# dfs, bfs 출력
print(*dfs(v, []))
print(*bfs(v))
알고리즘 공부 1달 점검
알고리즘을 시작한지 1달이 지났다.
지난 1달 동안 그리디와 구현 문제를 집중적으로 공부하였고, 이제 막 그래프 알고리즘인 DFS와 BFS에 대해 배우기 시작했다.
처음 백준에 입문했던 시기에 나는 하루에 1문제도 혼자서 풀 수 없었고, 답안을 보면서 배우는 등 코린이였다.
현재는 하루에 2문제 이상씩 푸는 것을 목표로 전진해 나가고 있다.
목표를 높게 설정하면 나도 그만큼 크게 성장할 수 있는 것 같다.
지금은 그리디와 간단한 구현 정도는 스스로의 힘으로 해결할 수 있고, 더 많은 알고리즘을 공부하기 위해 시간을 쪼개며 최선을 다하고 있다.
내가 거의 매일 블로그에 올리는 백준 문제들은 2회 이상 반복해서 문제를 푼 것이며, 최소 1회는 혼자 힘으로 처음부터 끝까지 코드를 작성해 내 문제로 만들고 있다.
내가 블로그에 백준 문제들을 정리하는 이유는 공부한 것을 복습하며 정리함과 동시에, 많은 사람들에게 코드를 공유해 같이 성장해나가고자 하는 내 바람이 있기 때문이다.
앞으로도 이 마음, 이 다짐 잊지 않고 내 닉네임인 Industriousness(부지런함) 닉값하기 위해 최선을 다해 볼 것이다.
항상 찾아와 주시는 구독자분들과 제 코드를 봐주시는 모든 분들께 감사의 말씀을 드립니다.
'PS Study > BOJ(백준)' 카테고리의 다른 글
[백준 15686번] 치킨 배달 - 파이썬 (74) | 2022.02.09 |
---|---|
[백준 2847번] 게임을 만든 동준이 - 파이썬 (45) | 2022.02.08 |
[백준 14503번] 로봇청소기 - 파이썬 (31) | 2022.02.08 |
[백준 1783번] 병든 나이트 - 파이썬 (43) | 2022.02.07 |
[백준 1543번] 문서 검색 - 파이썬 (37) | 2022.02.07 |