- dfs : 최대한 깊게 방문하지 않은 노드들에 쭉 방문하다가, 더이상 진행할 수 있는 인접정점이 없으면 되돌아감 - 재귀
- bfs : 한 노드에서 인접노드까지 방문한 적이 없는 모든 노드를 queue에 삽입. que는 FIFO 방식이라서 순차적인 구현
DFS
from collections import deque
r,c = map(int, input().split())
pasture = [list(input()) for _ in range(r)]
visit = [[0]*c for _ in range(r)]
d = [(0,1),(0,-1),(1,0),(-1,0)]
cnt = 0
def dfs(x, y) :
visit[x][y] = 1
for dx, dy in d :
nx,ny = x+dx, y+dy
if 0 <= nx < r and 0<= ny < c :
if not visit[nx][ny] and pasture[nx][ny] == '#' :
dfs(nx, ny)
for x in range(r) :
for y in range(c) :
# 그래프를 순회하면서 #(clump) 찾기 -> 찾으면 dfs 실행
if not visit[x][y] and pasture[x][y] == '#' :
dfs(x, y)
cnt += 1
print(cnt)
- 방문 표시를 위해서 입력 받는 그래프의 크기와 똑같은 visit 배열
- 상하좌우 탐색을 위한 direction 001-1선언
- dfs를 실행하면 방문 표시를 위한 visit에 1로 표시
- 탐색을 시작한 좌표에 direction을 활용해서 주변 방문
- 지금까지 방문한 적이 없고, 방문한 곳이 # 이라면 dfs 실행.. dfs 실행할 때마다 count..
BFS
from collections import deque
r,c = map(int, input().split())
pasture = [list(input()) for _ in range(r)]
# 상하좌우
d = [(-1,0), (1,0), (0,-1), (0,1)]
cnt = 0
def bfs(y, x) :
# 방문한 적이 없는 노드는 que에 삽입하는ㄱ ㅔ bfs
# q에 모든 노드 위치를 다 넣고, 방문 표시를 해줌
q = deque()
q.append((y,x))
pasture[y][x] = '1'
# q를 돌면서 방문한 노드를 체크해줌..
while q :
y,x = q.popleft()
# 상하좌우 돌기
for dy, dx in d :
Y,X = y+dy, x+dx
if 0 <= Y < r and 0 <= X < c and pasture[Y][X] == '#' :
q.append((Y,X))
pasture[Y][X] = '1'
for x in range(r) :
for y in range(c) :
# 그래프를 순회하면서 #(clump) 찾기 -> 찾으면 dfs 실행
if pasture[x][y] == '#' :
bfs(x, y)
cnt += 1
print(cnt)
- bfs 함수 앞쪽에는 방향, 그래프, 입력, q 정도 선언
- q.append(x,y)와 방문 표시로 시작
- q를 돌면서 x,y 좌표에는 q에 있는 좌표 (popleft)
- 선언한 방향을 활용해서 nx, ny 좌표 설정
- nx, ny 범위 조건 체크
- 원하는 조건 확인 & 방문 표시 & q에 방문한 nx, ny 좌표 삽입
그래프 문제 풀때
- 2차원 리스트 입력 받기 [list(input().split()) for _ in range(n)]
- direction 0, 0, 1, -1
- 조정한 nx ny는 r, c 범위 확인
'PS > BOJ&Programmers' 카테고리의 다른 글
[백준/3184] 양 | 그래프 영역 구별 하기 (2) | 2023.02.28 |
---|---|
[백준/10026] 적록색약 | 그래프 영역 구별, 같은 조건일 때 처리 (0) | 2023.02.27 |
[백준/8989] 시계 | 시침, 분침의 각도 (0) | 2023.02.19 |
[백준/2852] NBA 농구 (0) | 2023.02.16 |
[백준/6236] 용돈 관리 | 이진 탐색 트리 | 분할 | 파이썬 (0) | 2023.02.14 |