728x90

백준 1926 - 그림

시간 제한 2초, 메모리 제한 128MB

# 조건

  • 어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라.
  • 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자.
  • 가로나 세로로 연결된 것은 연결이 된 것이고 대각선으로 연결이 된 것은 떨어진 그림이다.
  • 그림의 넓이란 그림에 포함된 1의 개수이다.

# 접근 방법

  • 전형적인 그래프 탐색 문제이다.
  • 코테 대비를 하다보면 자주 만나는 영역의 개수 구하기와 동일한 문제이다.
  • BFS로 해당 그룹의 개수를 카운트 해주고 max_size를 갱신해 나가면 된다.
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
from collections import deque

di, dj = [1, -1, 0, 0], [0, 0, 1, -1]

def bfs(si, sj):
    global result_size
    q = deque()
    q.append((si, sj))
    temp = 1
    while q:
        qi, qj = q.popleft()
        for d in range(4):
            ni, nj = qi + di[d], qj+dj[d]
            if 0<=ni<N and 0<=nj<M and visited[ni][nj] == False and arr[ni][nj] == 1:
                q.append((ni, nj))
                visited[ni][nj] = True
                temp += 1

    result_size = max(result_size, temp)


N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
result_cnt = 0
result_size = 0

visited = [[False] * M for _ in range(N)]
for i in range(N):
    for j in range(M):
        if arr[i][j] == 1 and visited[i][j] == False:
            visited[i][j] = True
            result_cnt += 1
            bfs(i, j)

print(result_cnt)
print(result_size)
728x90