1926번: 그림
어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로
www.acmicpc.net
문제
어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로로 연결된 것은 연결이 된 것이고 대각선으로 연결이 된 것은 떨어진 그림이다. 그림의 넓이란 그림에 포함된 1의 개수이다.
입력
첫째 줄에 도화지의 세로 크기 n(1 ≤ n ≤ 500)과 가로 크기 m(1 ≤ m ≤ 500)이 차례로 주어진다. 두 번째 줄부터 n+1 줄 까지 그림의 정보가 주어진다. (단 그림의 정보는 0과 1이 공백을 두고 주어지며, 0은 색칠이 안된 부분, 1은 색칠이 된 부분을 의미한다)
출력
첫째 줄에는 그림의 개수, 둘째 줄에는 그 중 가장 넓은 그림의 넓이를 출력하여라. 단, 그림이 하나도 없는 경우에는 가장 넓은 그림의 넓이는 0이다.
코드
from collections import deque
n, m = map(int, input().split())
picture = []
for _ in range(n):
picture.append(list(map(int, input().split())))
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs(x, y, visited):
area = 1
q = deque([(x, y)])
visited[x][y] = True
while q:
x, y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
if picture[nx][ny] == 1 and not visited[nx][ny]:
q.append((nx, ny))
visited[nx][ny] = True
area += 1
return area
visited = [[False for _ in range(m)] for _ in range(n)]
num = 0
ans = 0
for i in range(n):
for j in range(m):
if picture[i][j] == 1 and not visited[i][j]:
a = bfs(i, j, visited)
num += 1
ans = max(ans, a)
print(num)
print(ans)
기본적인 BFS만 안다면 쉽게 풀 수 있는 문제이다.
BFS 함수 내에서 그림의 넓이를 구할 때는 큐에 추가가 가능하다면 아직 방문 안 한 구역이므로 큐에 추가할 때마다 area 변수를 1씩 증가시키면 이 그림의 넓이를 구할 수 있다.
전체 도화지에 대해 좌표별로 살펴보며 아직 방문 안 한 좌표의 그림이 나올 때마다 bfs를 실행시키며 그 중 최대 넓이를 구하고 bfs가 실행된 횟수를 체크하면 그것이 바로 그림의 개수이다.
'문제풀이 > DFS_BFS' 카테고리의 다른 글
[Python/파이썬] 백준 14503번 로봇 청소기 (0) | 2022.10.02 |
---|---|
[Python/파이썬] 백준 5014번 스타트링크 (0) | 2022.09.27 |
[Python/파이썬] 백준 9205번 맥주 마시면서 걸어가기 (0) | 2022.09.17 |
[Python/파이썬] 백준 2573번 빙산 (0) | 2022.09.16 |
[Python] 백준 2239번 스도쿠 (0) | 2022.08.16 |
1926번: 그림
어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로
www.acmicpc.net
문제
어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로로 연결된 것은 연결이 된 것이고 대각선으로 연결이 된 것은 떨어진 그림이다. 그림의 넓이란 그림에 포함된 1의 개수이다.
입력
첫째 줄에 도화지의 세로 크기 n(1 ≤ n ≤ 500)과 가로 크기 m(1 ≤ m ≤ 500)이 차례로 주어진다. 두 번째 줄부터 n+1 줄 까지 그림의 정보가 주어진다. (단 그림의 정보는 0과 1이 공백을 두고 주어지며, 0은 색칠이 안된 부분, 1은 색칠이 된 부분을 의미한다)
출력
첫째 줄에는 그림의 개수, 둘째 줄에는 그 중 가장 넓은 그림의 넓이를 출력하여라. 단, 그림이 하나도 없는 경우에는 가장 넓은 그림의 넓이는 0이다.
코드
from collections import deque n, m = map(int, input().split()) picture = [] for _ in range(n): picture.append(list(map(int, input().split()))) dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] def bfs(x, y, visited): area = 1 q = deque([(x, y)]) visited[x][y] = True while q: x, y = q.popleft() for i in range(4): nx = x + dx[i] ny = y + dy[i] if 0 <= nx < n and 0 <= ny < m: if picture[nx][ny] == 1 and not visited[nx][ny]: q.append((nx, ny)) visited[nx][ny] = True area += 1 return area visited = [[False for _ in range(m)] for _ in range(n)] num = 0 ans = 0 for i in range(n): for j in range(m): if picture[i][j] == 1 and not visited[i][j]: a = bfs(i, j, visited) num += 1 ans = max(ans, a) print(num) print(ans)
기본적인 BFS만 안다면 쉽게 풀 수 있는 문제이다.
BFS 함수 내에서 그림의 넓이를 구할 때는 큐에 추가가 가능하다면 아직 방문 안 한 구역이므로 큐에 추가할 때마다 area 변수를 1씩 증가시키면 이 그림의 넓이를 구할 수 있다.
전체 도화지에 대해 좌표별로 살펴보며 아직 방문 안 한 좌표의 그림이 나올 때마다 bfs를 실행시키며 그 중 최대 넓이를 구하고 bfs가 실행된 횟수를 체크하면 그것이 바로 그림의 개수이다.
'문제풀이 > DFS_BFS' 카테고리의 다른 글
[Python/파이썬] 백준 14503번 로봇 청소기 (0) | 2022.10.02 |
---|---|
[Python/파이썬] 백준 5014번 스타트링크 (0) | 2022.09.27 |
[Python/파이썬] 백준 9205번 맥주 마시면서 걸어가기 (0) | 2022.09.17 |
[Python/파이썬] 백준 2573번 빙산 (0) | 2022.09.16 |
[Python] 백준 2239번 스도쿠 (0) | 2022.08.16 |