본문 바로가기

알고리즘/백준 문제풀이

백준 1012 - 유기농 배추(파이썬)

728x90

https://www.acmicpc.net/problem/1012

 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 

www.acmicpc.net

문제 접근

  • 이차원 배열에서 배추의 위치가 1로 주어질 때 인접한 배추가 몇 쌍인지를 구하면 되는 문제
  • 모든 좌표를 확인해서 1일 때 인접한 1들을 전부 0으로 바꾸고 카운트를 증가시키는 방법으로 접근
  • 인접한 1들의 상하좌우를 모두 탐색하기 위해 bfs 활용

정답 코드

from collections import deque

dx = [0,0,1,-1]
dy = [1, -1, 0,0]

t = int(input())

# 주변에 1들을 모두 0으로 만드는 메서드
def bfs(graph, a, b):
    q = deque()
    q.append((a,b))
    graph[a][b] = 0

    # 근처에 1이 없을때까지 반복
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx <0 or nx >= n or ny<0 or ny>= m:
                continue
            # 근처의 1들을 0으로 만들기
            if graph[nx][ny] == 1:
                graph[nx][ny] = 0
                # 이동한 위치에서도 동서남북 검사하도록 큐에 추가
                q.append((nx, ny))
    return

for i in range(t):
    cnt = 0
    n, m, k = map(int, input().split())
    # 이차원 배열 생셩
    graph = [[0] * m for _ in range(n)]

    # 지렁이 위치 추가
    for j in range(k):
        x, y = map(int, input().split())
        graph[x][y] = 1
    
    for a in range(n):
        for b in range(m):
            if graph[a][b] == 1:
                # 주변 1들을 모두 0으로 만들기
                bfs(graph, a, b)
                cnt += 1

    print(cnt)