Koala - 7기/기초 알고리즘 스터디

[백준/Python] 1926 그림

ekmonet1 2022. 8. 30. 00:57

문제

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

 

1926번: 그림

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

www.acmicpc.net

코드

def flood_fill():
    global val
    check[i][j]=val
    q.append((i,j))
    while q:
        x,y=q.popleft()
        for k in range(4):
            nx,ny=x+dx[k],y+dy[k]
            if 0 <=nx <n and 0 <= ny <m:
                if arr[nx][ny] and not check[nx][ny]:
                    check[nx][ny]=val
                    q.append((nx,ny))
    
from collections import deque
dx,dy=[-1,1,0,0],[0,0,-1,1]
n,m=map(int,input().split())
arr=[]
for _ in range(n):
    arr.append(list(map(int,input().split())))
check=[[0]*m for _ in range(n)]
val=1
q=deque()
for i in range(n):
    for j in range(m):
        if arr[i][j] == 1 and check[i][j] == 0:
            flood_fill()
            val+=1
            
print(val-1)

line=[0 for _ in range(val)]

for i in range(n):
    for j in range(m):
        if check[i][j] !=0:
            line[check[i][j]] += 1
if len(line)!=0:
    print(max(line))
else:
    print(0)

 

풀이

가로나 세로로 연결된 그림의 넓이를 찾기 위해 flood_fill()함수를 설정하여 val로 개수를 세고 list에 val만큼의 공간을 만들어서 세어진 val의 개수를 list 안에 넣어 그림의 넓이의 최댓값을 찾아 출력한다.