[python] 백준 1012- 유기농 배추

SJ H·2022년 6월 28일
0

문제 - 유기농 배추

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

문제 설명

그림이 있어 링크 참조

입력

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 첫째 줄에는 배추를 심은 배추밭의 가로길이 M(1 ≤ M ≤ 50)과 세로길이 N(1 ≤ N ≤ 50), 그리고 배추가 심어져 있는 위치의 개수 K(1 ≤ K ≤ 2500)이 주어진다. 그 다음 K줄에는 배추의 위치 X(0 ≤ X ≤ M-1), Y(0 ≤ Y ≤ N-1)가 주어진다. 두 배추의 위치가 같은 경우는 없다.

출력

각 테스트 케이스에 대해 필요한 최소의 배추흰지렁이 마리 수를 출력한다.

🤨풀이를 어떻게 생각했는가?

1. 문제의 조건

  • 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다.

  • 한 배추의 상하좌우 네 방향에 다른 배추가 위치한 경우에 서로 인접해있는 것이다.

  • 배추들이 모여있는 곳에는 배추흰지렁이가 한 마리만 있으면 되므로 서로 인접해있는 배추들이 몇 군데에 퍼져있는지 조사하면 총 몇 마리의 지렁이가 필요한지 알 수 있다

2. 고민 과정

  • 배추밭이 어디까지 인지 구해서 총 갯수를 출력하면 된다.
  • 상하좌우에 위치할 경우 인접한것으로 인정하므로 너비우선탐색(BFS)로 구하면 될 것 같다.

3. 주요 포인트

  • 배추들이 모여있는 곳에는 배추흰지렁이가 한 마리만 있으면 되므로 서로 인접해있는 배추들이 몇 군데에 퍼져있는지 조사하면 총 몇 마리의 지렁이가 필요한지 알 수 있다.

4. 구현 과정

  1. 몇개인지 구하기 위한 BFS를 먼저 구현해 준다.
def BFS(cy, cx):
    q = deque()
    q.append((cy, cx))
    field[cy][cx] = 0
    while q:
        y, x = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx < 0 or ny < 0 or nx >= M or ny >= N or field[ny][nx] == 0:
                continue
            field[ny][nx] = 0
            q.append((ny, nx))
    return
  1. 총 몇개의 지렁이가 필요한지 구하는 earthworm(지렁이)함수를 구현해준다.
def earthworm(M, N):
    total = 0
    for cy in range(N):
        for cx in range(M):
            if field[cy][cx] == 0:
                continue
            else:
                BFS(cy, cx)
                total += 1
    return total
  1. 입력값을 받아 배추가 심어져있는 밭의 배열을 만들고, 위의 함수들을 이용해 필요한 지렁이의 갯수를 출력한다.
#전체코드# 
from collections import deque


def BFS(cy, cx):
    q = deque()
    q.append((cy, cx))
    field[cy][cx] = 0
    while q:
        y, x = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            #갈수 없거나 이미 간 곳이면 넘어간다.
            if nx < 0 or ny < 0 or nx >= M or ny >= N or field[ny][nx] == 0:
                continue
            field[ny][nx] = 0
            q.append((ny, nx))
    return


def earthworm(M, N):
    total = 0
    #전체밭을 탐색하며 배추가 있다면 BFS를 수행 후 총 갯수에 1을 더하고 합을 출력한다.
    for cy in range(N): 
        for cx in range(M):
            if field[cy][cx] == 0:
                continue
            else:
                BFS(cy, cx)
                total += 1
    return total


T = int(input())
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
for _ in range(T):
    M, N, K = map(int, input().split())
    field = [[0] * M for _ in range(N)]
    #밭을 만들고, 배추가 심어져 있는 땅을 입력받아 그 좌표만 1로 바꿔준다.
    for _ in range(K):
        x, y = map(int, input().split())
        field[y][x] = 1
    print(earthworm(M, N))

🤔생각

  • 바로 이전 문제가 비슷한 BFS를 이용하는 삼성 기출문제라 그런지 어렵지는 않았다. 사실 BFS를 알고 있다면 어렵지 않게 풀 수 있는 문제 같다.
profile
하하

0개의 댓글