fork download
  1. from collections import deque
  2.  
  3. dx = [-1, 1, 0, 0] # 방향 벡터 차례대로 dx,dy인덱스 순으로 더해보면 상하좌우임을 알수있다.
  4. dy = [0, 0, -1, 1]
  5.  
  6.  
  7. def bfs(x, y):
  8. queue = deque([(x, y)]) # 큐 초기값 x와 y넣어줌(bfs 함수인자로 넘어온 x,y)
  9. while queue:
  10. x, y = queue.popleft() # 큐에서 하나를 빼고 x,y 변수에 그값들을 넣어줌
  11. for i in range(4): # 상하좌우 위에 말한 방향 벡터순으로 돌림
  12. nx, ny = x + dx[i], y + dy[i]
  13. if nx >= N or nx < 0 or ny >= M or ny < 0 or arr[nx][ny] == 0: # 범위를 초과하거나 배추가 없는곳(0인 부분)을 제외시킴
  14. continue
  15. arr[nx][ny] = 0 # 탐색 했으니 방문했다라는 표시로 0으로 만듬 -> 앞으로 여기는 0이기 때문에 위에 써둔 조건때문에 앞으로 탐색하지 않음
  16. queue.append((nx, ny)) # 이곳을 기준으로 다시 상하좌우를 봐야하기 때문에 큐에 넣어줌
  17.  
  18. # 여기선 직접 arr값을 변경시킴으로 방문을 했다라고 표시했지만 만약 bfs이후에도 arr이 쓸 곳이 있어서 변경되면 안되는 경우
  19. # visited 리스트를 생성해서 visited = [[False for _ in range(M)] for _ in range(N)] visited[nx][ny] = True로 변경해가면서 처리하시면 됩니다
  20.  
  21.  
  22.  
  23. T = int(input()) # 테스트 케이스
  24.  
  25. for _ in range(T):
  26. N, M, K = map(int, input().split()) # 원래는 M,N,K 순이지만 편의상 N,M을 바꿨음
  27. arr = [[0 for _ in range(M)] for _ in range(N)] # 리스트 컴프리헨션 모르면 구글에 검색
  28. ans = 0 # 답을 출력할 변수
  29. for _ in range(K):
  30. x, y = map(int, input().split())
  31. arr[x][y] = 1 # 배추가 있는곳 1로 표시
  32. for i in range(N):
  33. for j in range(M):
  34. if arr[i][j] == 1: # arr 2차원배열로 돌면서 배추가 있는곳은 bfs돌림
  35. bfs(i, j)
  36. ans += 1 # bfs가 끝났다면 상하좌우 인접한 배추들이 전부 탐색 됐을거고 이 한덩어리들이 배추흰지렁이들이 필요한 곳이기 때문에 1 더함
  37. print(ans)
  38.  
Success #stdin #stdout 0.02s 9200KB
stdin
2
10 8 17
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5
stdout
5
1