
문제 링크 : https://www.acmicpc.net/problem/1012
📌 문제 분류: 자료구조, 그래프 탐색
📦 알고리즘: BFS (너비 우선 탐색)
🎯 난이도: 실버 2
어떤 배추밭에 배추가 심어져 있을 때, 서로 인접한 배추들이 하나의 지렁이로 방제될 수 있다고 한다. 지렁이 최소 수를 구하라는 문제.
이 문제는 결국 연결 요소 개수를 구하는 전형적인 그래프 탐색 문제이다.
M × N 크기의 그래프 생성1 표시1에서 BFS 탐색 시작from collections import deque
# 상하좌우 이동
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs(x, y):
queue = deque()
queue.append((x, y))
visited[x][y] = True
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
if not visited[nx][ny] and graph[nx][ny] == 1:
visited[nx][ny] = True
queue.append((nx, ny))
# 테스트 케이스 개수
T = int(input())
for _ in range(T):
m, n, k = map(int, input().split())
graph = [[0] * m for _ in range(n)]
visited = [[False] * m for _ in range(n)]
for _ in range(k):
x, y = map(int, input().split())
graph[y][x] = 1
count = 0
for i in range(n):
for j in range(m):
if graph[i][j] == 1 and not visited[i][j]:
bfs(i, j)
count += 1
print(count)
deque 사용으로 빠르고 메모리 효율적그래프 탐색, BFS, 연결 요소 개수, 실버2, Python, deque, 지렁이, 유기농 배추, DFS vs BFS
DFS도 문제 해결이 가능하지만, 재귀 깊이 제한에 유의해야 한다.
import sys
sys.setrecursionlimit(10000) # 재귀 깊이 제한 해제
# 상하좌우
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def dfs(x, y):
visited[x][y] = True
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
if not visited[nx][ny] and graph[nx][ny] == 1:
dfs(nx, ny)
# 테스트 케이스 수
T = int(input())
for _ in range(T):
m, n, k = map(int, input().split())
graph = [[0] * m for _ in range(n)]
visited = [[False] * m for _ in range(n)]
for _ in range(k):
x, y = map(int, input().split())
graph[y][x] = 1
count = 0
for i in range(n):
for j in range(m):
if graph[i][j] == 1 and not visited[i][j]:
dfs(i, j)
count += 1
print(count)