가로 M, 세로 N 크기의 배추밭에 배추가 심어져 있습니다.
배추는 1x1 크기로 심어져 있으며, 배추가 심어져 있지 않은 곳은 0으로 표시됩니다.
배추가 심어져 있는 곳은 1로 표시됩니다.
해충을 막기 위해 배추흰지렁이 한 마리를 배추밭에 놓으려고 합니다.
배추흰지렁이는 인접한 배추를 모두 관리할 수 있습니다.
최소 몇 마리의 배추흰지렁이를 놓아야 하는지 구하는 프로그램을 작성하면 됩니다.
첫 줄에는 테스트 케이스의 개수 T가 주어집니다.
각 테스트 케이스의 첫 줄에는 배추밭의 가로 M, 세로 N, 배추가 심어져 있는 위치의 개수 K가 차례로 주어집니다.
배추의 위치는 다음 K개의 줄에 주어집니다.
배추의 위치는 (x, y)로 주어지며, x는 가로 좌표, y는 세로 좌표입니다.
(0 ≤ x < M, 0 ≤ y < N)
import sysfrom collections import dequesys.setrecursionlimit(10000) # DFS 사용 시 재귀 제한 증가 (예방 차원)T = int(sys.stdin.readline()) # 테스트 케이스 수dx = [0, 0, 1, -1] # 좌우dy = [1, -1, 0, 0] # 상하for _ in range(T): M, N, K = map(int, sys.stdin.readline().split()) # 가로(M), 세로(N), 배추 위치 수(K) ground = [[0] * M for _ in range(N)] # 배추밭 초기화 (세로 x 가로) visited = [[False] * M for _ in range(N)] # 방문 체크 배열 for _ in range(K): # 배추 위치 표시 x, y = map(int, sys.stdin.readline().split()) ground[y][x] = 1 # BFS로 연결된 배추 그룹 탐색 def bfs(y, x): queue = deque() queue.append((y, x)) visited[y][x] = True while queue: cy, cx = queue.popleft() for d in range(4): ny, nx = cy + dy[d], cx + dx[d] if 0 <= ny < N and 0 <= nx < M: if not visited[ny][nx] and ground[ny][nx] == 1: visited[ny][nx] = True queue.append((ny, nx)) count = 0 # 지렁이 수 for i in range(N): for j in range(M): if not visited[i][j] and ground[i][j] == 1: bfs(i, j) count += 1 # 새로운 연결 그룹 발견 시 증가 print(count)