BOJ
[BOJ] 1926. 그림
rubato.dev
2025. 7. 22. 17:35
📌 문제 제목
문제 링크: BOJ 1926
🗒️ 문제 설명
어떤 도화지에 그림이 그려져 있을 때, 그 그림의 개수와 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라.
단, 그림이라는 것은 1로 연결된 것을 그림이라고 정의한다.
시간 제한: 2초
메모리 제한: 128MB
세로 크기: 1 <= n <= 500
가로 크기: 1 <= m <= 500
💡 문제 해결 아이디어
- NM이 250,000 이므로 O(NM)의 시간복잡도를 가진 알고리즘을 사용하면 해결 가능.
- 이차원 배열을 순회하며 그림의 시작점을 찾고 BFS로 그림의 개수와 넓이를 구한다.
- 그림의 개수는 이차원 배열을 돌며 BFS를 수행할 때마다 count를 증가시킨다.
- 그림의 넓이는 BFS의 리턴값을 해당 그림의 넓이로 하고, BFS가 끝나면 해당 그림의 넓이와 이전에 저장해둔 그림의 최대 넓이를 비교한다.
⌛️ 시간 복잡도
- O(NM)
✅ 최종 코드
import sys
from collections import deque
input = sys.stdin.readline
N, M = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(N)]
visited = [[False] * M for _ in range(N)]
direction = [(-1, 0), (1, 0), (0, -1), (0, 1)]
def bfs(graph, x, y, visited) -> int:
queue = deque([(x, y)])
visited[x][y] = True
area = 1
while queue:
xp, yp = queue.popleft()
for dx, dy in direction:
nx, ny = xp + dx, yp + dy
if not (0 <= nx < N and 0 <= ny < M):
continue
if not visited[nx][ny] and graph[nx][ny] == 1:
queue.append((nx, ny))
visited[nx][ny] = True
area += 1
return area
count = 0
mx = 0
for i in range(N):
for j in range(M):
if not visited[i][j] and graph[i][j] == 1:
count += 1
area = bfs(graph, i, j, visited)
mx = max(mx, area)
print(count)
print(mx)