CS/Algorithm
[Python / 2667] 단지번호 붙이기
yujindonut
2022. 6. 8. 00:11
728x90
문제 :
https://www.acmicpc.net/problem/2667
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여
www.acmicpc.net
조건
- 1은 집이 있는 곳, 0은 집이 없는 곳
- 단지 수를 출력
- 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력
- 대각선 상에 있는 집은 연결된 것이 X - 상하좌우만 연결된것
문제 접근
1. bfs로 풀이
2. 탐색중인 위치를 0으로 바꿔서 다시 방문하지 않도록!
문제풀이
#https://www.acmicpc.net/problem/2667
import sys
input = sys.stdin.readline
from collections import deque
n = int(input())
graph = []
for _ in range(n):
graph.append(list(map(int, input().strip())))
#strip : \n 문자열 제거
dx = [-1,1,0,0]
dy = [0,0,1,-1]
def bfs(x,y):
q = deque()
count = 0
q.append((x,y))
while q:
px,py = q.popleft()
if graph[px][py] == 1:
graph[px][py] = 0 #탐색중인 위치를 0으로 바꾸어서 다시 방문하지 않도록 한다
count += 1
for i in range(4):
nx = px + dx[i]
ny = py + dy[i]
if 0 <= nx < n and 0 <= ny < n:
q.append((nx,ny))
return count
result = 0
house = []
for i in range(n):
for j in range(n):
if graph[i][j] != 0:
house.append(bfs(i,j))
result += 1
house.sort()
print(len(house))
for i in range(len(house)):
print(house[i])
728x90