알고리즘 (Python)/DFS BFS
[백준(BOJ)] 2667번 : 단지번호 붙이기 - Python(파이썬) - (실버1, BFS DFS)
개발자 쿠키
2024. 8. 18. 14:47
풀이
BFS로도 DFS로도 풀 수 있는 문제이다.
연결요소 유형이고, 방문했을 때, 방문한 곳을 0으로 바꿔준다는게 핵심이다!
지금도 자꾸 함수를 외워서, 그리고 아주조금 생각하면서 풀고 있는데, 흰 종이를 가져와 그래프를 그림과 표로
방문해준 곳을 어떻게 방문표시를 해줄건지 생각하며 풀어보자.
BFS로 풀기
from collections import deque
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
def bfs(graph, x, y):
queue = deque()
queue.append((x, y))
graph[x][y] = 0
cnt = 1
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or ny < 0 or nx >= n or ny >= n:
continue
if graph[nx][ny] == 1:
graph[nx][ny] = 0
queue.append((nx, ny))
cnt += 1
return cnt
n = int(input())
graph = []
for i in range(n):
graph.append(list(map(int, input())))
array = []
for i in range(n):
for j in range(n):
if graph[i][j] == 1:
array.append(bfs(graph, i, j))
array.sort()
print(len(array))
for i in array:
print(i)
DFS로 풀기
n = int(input())
graph = []
for i in range(n):
graph.append(list(map(int, input())))
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
def dfs(x, y):
if x < 0 or y < 0 or x >= n or y >= n:
return False
if graph[x][y] == 1:
global cnt
cnt += 1
graph[x][y] = 0
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
dfs(nx, ny)
return True
return False
cnt = 0
result = 0
array = []
for i in range(n):
for j in range(n):
if dfs(i, j) == True:
array.append(cnt)
result += 1
cnt = 0
array.sort()
print(result)
for i in range(len(array)):
print(array[i])