새소식

카테고리 없음

[백준/1926] 그림 (Python)

  • -

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

 

1926번: 그림

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

www.acmicpc.net

 

Difficulty : Silver 1

 

Status : Solved

 

Time : 00:04:08

 


 

문제 설명

 

더보기

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

 

입력 및 출력

 

더보기

입력

첫째 줄에 도화지의 세로 크기 n(1 ≤ n ≤ 500)과 가로 크기 m(1 ≤ m ≤ 500)이 차례로 주어진다. 두 번째 줄부터 n+1 줄 까지 그림의 정보가 주어진다. (단 그림의 정보는 0과 1이 공백을 두고 주어지며, 0은 색칠이 안된 부분, 1은 색칠이 된 부분을 의미한다)

 

출력

첫째 줄에는 그림의 개수, 둘째 줄에는 그 중 가장 넓은 그림의 넓이를 출력하여라. 단, 그림이 하나도 없는 경우에는 가장 넓은 그림의 넓이는 0이다.

 

입력 예시

6 5
1 1 0 1 1
0 1 1 0 0
0 0 0 0 0
1 0 1 1 1
0 0 1 1 1
0 0 1 1 1

 

출력 예시

 

4
9

 

 


 

풀이

 

..왠지 오늘 보는 문제들은 하나같이 기본적인 문제가 많다..?

그림 전체를 순회하며 방문하지 않은 1을 만날 때마다 인접한 1에 대해 탐색을 시행하면 된다. 탐색한 넓이와 탐색 횟수를 출력하면 끝. 탐색 알고리즘은 BFS, DFS 상관이 없다.

 

풀이 코드

from collections import deque
import sys
input = sys.stdin.readline

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

n, m = map(int, input().split())
canvas = [list(map(int, input().split())) for _ in range(n)]
visited = [[False]*m for _ in range(n)]

def bfs(x, y) :
  visited[y][x] = True
  cnt = 1
  q = deque([(x, y)])
  while q :
    x, y = q.popleft()
    for k in range(4) :
      ax, ay = x + dx[k], y + dy[k]
      if -1 < ax < m and -1 < ay < n and canvas[ay][ax] == 1 and not visited[ay][ax] :
        visited[ay][ax] = True
        q.append((ax, ay))
        cnt += 1

  return cnt

cnt = 0
result = 0
for i in range(n) :
  for j in range(m) :
    if canvas[i][j] == 1 and not visited[i][j] :
      cnt += 1
      result = max(result, bfs(j, i))
print(cnt)
print(result)

풀이 완료!

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.