Skip to content

Commit e313b45

Browse files
committed
[BOJ]#1926. 그림/실버1/38min
https://www.acmicpc.net/problem/1926
1 parent 450c803 commit e313b45

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

Hongjoo/백준/그림.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
"""
2+
[BOJ]#1826.그림
3+
https://www.acmicpc.net/problem/1926
4+
# problem
5+
- 그림은 1로 가로,세로(대각선x) 연결됨
6+
- 그림 넓이 = 1의 개수 (0:여백)
7+
-goal) 전체 nxm 도화지 속 (1) 그림 개수 (2)그림들 중 최대 넓이
8+
*없으면 0 0 출력
9+
# flow
10+
1. 그림 개수 구하기
11+
i. 전체 칸(i,j)을 기준점으로 BFS/DFS로 연결된 그래프 더미 찾기
12+
13+
2. 최대 그림 넓이
14+
- 그래프 탐색시 각 그래프에서 방문한 노드의 개수 확인&최대값 저장하기
15+
"""
16+
17+
import sys
18+
from collections import deque
19+
# 1. 입력 변수 - 전체 도화지 크기 / 도화지 속 그림 위치 정보
20+
input = sys.stdin.readline
21+
N,M = map(int, input().split())
22+
23+
canvas = [[0]*M for _ in range(N)]
24+
for i in range(N):
25+
canvas[i] = list(map(int, input().split()))
26+
# print(canvas)
27+
# 그림 개수 /최대 그림 넓이 변수 선언
28+
pic_cnt = 0
29+
pic_area = 0
30+
31+
#2. 전체 도화지 칸을 탐색하며서 BFS로 그림들 연결하기
32+
def bfs(start):
33+
# 해당 노드 1 의 개수, 방문한 노드 위치 정보 -> canvas 의 0으로 기입
34+
one_cnt = 0 # start 초기화
35+
q =deque([start])
36+
canvas[start[0]][start[1]] = 0
37+
dy = [-1,1,0,0] # 상하좌우 이동 가능
38+
dx = [0,0,-1,1]
39+
40+
while q :
41+
cy,cx = q.popleft()
42+
one_cnt +=1 #그림 넓이 추가
43+
44+
for d in range(4):
45+
ny,nx= cy+dy[d], cx +dx[d]
46+
47+
if 0<=ny<N and 0<= nx <M and canvas[ny][nx] == 1 : # 범위 내, 그림 범위임
48+
q.append([ny,nx])
49+
canvas[ny][nx]=0
50+
51+
return one_cnt
52+
53+
#3. 전체 칸을 BFS탐색 시작점으로 순회하기
54+
55+
for i in range(N) :
56+
for j in range(M):
57+
if canvas[i][j] == 1 : #그림이면,BFS 탐색 시작
58+
area=bfs([i,j])
59+
# 그림 최대 넓이 업데이트하기
60+
if area > 0 : # 그림이 존재하면, 그림 개수 +1 & 넓이 최대값 업데이트
61+
pic_cnt += 1
62+
pic_area = max(pic_area,area)
63+
64+
print(pic_cnt)
65+
print(pic_area)

0 commit comments

Comments
 (0)