풀이
“단지번호붙이기” 문제와 유사한 문제이다.
이어져 있는 정점들을 하나의 그룹으로 묶어서 몇개의 그룹이 필요한 지 알아내는 문제이다.
2중 반복문을 통해 2차원 배열을 탐색하는 중 1이 발견될 시 BFS 를 통해 인접하는 모든 1들을 방문처리 해준 뒤 ans 를 1 더해준다.
이를 2차원배열의 끝까지 반복하면 총 몇개의 그룹이 생성되었는지 ans 출력을 통해 알 수 있다.
소스코드
# 유기농 배추
from collections import deque
import sys
input = sys.stdin.readline
def bfs(graph, i, j):
q = deque()
q.append([i, j])
graph[i][j] = 0 # 시작 점 방문처리
while q:
x, y = q.popleft()
for k in range(4):
nx = x + dx[k]
ny = y + dy[k]
if 0 <= nx < n and 0 <= ny < m: # 범위 내일 때
if graph[nx][ny] == 1: # 집이 이어져 있을 경우
q.append([nx, ny])
graph[nx][ny] = 0 # 방문 처리
return
dx = [1, -1, 0, 0]
dy = [0, 0, -1, 1]
for t in range(int(input())):
m, n, k = map(int, input().split())
graph = [[0] * m for _ in range(n)]
ans = 0
for p in range(k):
y, x = map(int, input().split())
graph[x][y] = 1
for i in range(n):
for j in range(m):
if graph[i][j] == 1:
bfs(graph, i, j)
ans += 1
print(ans)