1 분 소요

1. 문제

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

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

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

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

// 예제 입력 1 
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

// 예제 출력 1 
4
9


2. 핵심 아이디어

  • BFS 활용


3. Python 문제풀이

import sys
from collections import deque
input = sys.stdin.readline
 
def bfs(x, y) :
  cnt = 1
  q = deque()
  q.append((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 graph[nx][ny] == 1 and not visited[nx][ny] :
          visited[nx][ny] = True
          q.append((nx, ny))
          cnt += 1
  return cnt
 
n, m = map(int, input().split())
visited = [[False] * m for _ in range(n)]
graph = [list(map(int, input().split())) for _ in range(n)]
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
 
count, mcnt = 0, 0
for i in range(n) :
  for j in range(m) :
    if graph[i][j] == 1 and not visited[i][j] :
      count += 1 
      mcnt = max(mcnt, bfs(i, j))
 
print(count)
print(mcnt)


4. Java 문제풀이


댓글남기기