728x90
문제
https://www.acmicpc.net/problem/2667
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여
www.acmicpc.net
# 1012 유기농 배추 문제와 11724 연결요소의 개수문제의 합성문제와 같다.
정답
from collections import deque
n = int(input())
graph = [list(map(int, input())) for _ in range(n)]
cnt = []
dx = [-1, 1, 0, 0] # 좌, 우
dy = [0, 0, -1, 1] # 상, 하
def bfs(i,j):
q = deque()
q.append((i,j))
count = 1 # 각 단지의 집의 수를 세긴 위한 변수. 매개변수로 넘어왔다는 것은 집이 있는 곳(1)이라는 의미이므로 초기값 1부터 시작.
graph[i][j] = 0 # 중복으로 방문하지 않기 위해 0으로 설정
while q:
x, y = q.popleft()
for t in range(4): # 상하좌우(인접)로 분리해서 찾음
nx = x+dx[t]
ny = y+dy[t]
if nx < 0 or nx >= n or ny < 0 or ny >= n: # 해당 범위 밖 일때는 논외
continue
if graph[nx][ny] == 1: # 집이 있는 곳이면
graph[nx][ny] = 0 # 중복방문을 하지 않기 위해 0 설정
count+=1 # 단지의 집의 수 1 증가
q.append((nx,ny)) # q에 추가
return count
for i in range(n):
for j in range(n):
if graph[i][j] == 1: # 집이 있는 곳이라면
cnt.append(bfs(i,j)) # bfs 실행해서 각 단지의 집의 수를 cnt 리스트에 저장
cnt.sort() # 정렬 후 단지의 수와 각 단지의 집의 수를 출력
print(len(cnt))
for i in cnt:
print(i)
'알고리즘 > baekjoon' 카테고리의 다른 글
[알고리즘/baekjoon] 7569_토마토2(python) (0) | 2021.11.27 |
---|---|
[알고리즘/baekjoon] 6064_카잉 달력(python) (0) | 2021.11.27 |
[알고리즘/baekjoon] 2178_미로 탐색(python) (0) | 2021.11.26 |
[알고리즘/baekjoon] 1992_쿼드트리(python) (0) | 2021.11.26 |
[알고리즘/baekjoon] 1074_Z(python) (0) | 2021.11.25 |
댓글