문제
어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로로 연결된 것은 연결이 된 것이고 대각선으로 연결이 된 것은 떨어진 그림이다. 그림의 넓이란 그림에 포함된 1의 개수이다.
입력
첫째 줄에 도화지의 세로 크기 n(1 ≤ n ≤ 500)과 가로 크기 m(1 ≤ m ≤ 500)이 차례로 주어진다. 두 번째 줄부터 n+1 줄 까지 그림의 정보가 주어진다. (단 그림의 정보는 0과 1이 공백을 두고 주어지며, 0은 색칠이 안된 부분, 1은 색칠이 된 부분을 의미한다)
출력
첫째 줄에는 그림의 개수, 둘째 줄에는 그 중 가장 넓은 그림의 넓이를 출력하여라. 단, 그림이 하나도 없는 경우에는 가장 넓은 그림의 넓이는 0이다.
풀이
BFS로 풀이하였다.
그래프는 이미 주어졌기때문에 그래프와 크기가 같은 방문 여부를 파악하는 리스트를 만들었고
BFS함수 안에 direction 리스트를 만들어
가로 +- 1 , 세로 +- 1 은 인접한 것으로 파악하도록 하였다.
연결요소의 크기와 개수를 파악해야되기 때문에
bfs 함수에서 크기를 리턴하고
bfs가 실행될 때 마다 count를 1씩 추가하였다.
import sys
from collections import deque
input = sys.stdin.readline
n, m = map(int, input().split())
graph=[]
for _ in range(n):
li = list(map(int, input().split()))
graph.append(li)
visited = [[False]*m for _ in range(n)]
def bfs(x, y):
direction = [(-1, 0),(1, 0),(0, 1),(0, -1)]
len=0
queue=deque([(x, y)])
visited[x][y] = True
len+=1
while queue:
cx, cy = queue.popleft()
for dx, dy in direction:
nx, ny = cx+dx, cy+dy
if 0<=nx<n and 0<=ny<m and not visited[nx][ny] and graph[nx][ny]:
queue.append((nx,ny))
visited[nx][ny]=True
len+=1
return len
cnt = 0
max = 0
for i in range(n):
for j in range(m):
if not visited[i][j] and graph[i][j]:
len=bfs(i, j)
cnt+=1
if max<len:
max=len
print(cnt)
print(max)
'Algorithm > 백준' 카테고리의 다른 글
[백준] 2638 - 치즈 (python) (0) | 2025.03.23 |
---|---|
[백준] 2178 - 미로 탐색 (python) (0) | 2025.01.16 |
[백준] 1987 - 알파벳 (Python) (0) | 2025.01.15 |
[백준] 11724 - 연결 요소의 개수 (python) (0) | 2025.01.12 |
[백준] 1394 - 암호 (Python) (0) | 2024.08.15 |