본문 바로가기
알고리즘/python

2667번 단지번호붙이기(python3)

by 펀구구 2022. 1. 29.

bfs 알고리즘을 사용하면 해결할 수 있는 문제다.

지도의 전체에 bfs알고리즘을 적용하면 되는데, 이미 방문했거나 아파트가 아닌 지역은 bfs를 적용해주지 않고 bfs가 적용이 된다면 같은 단지임을 알려줄 수 있게 visited 배열을 설정해주면 된다.

from collections import deque

N = int(input())
apart = []
for i in range(N):
    data = input()
    data1 = []
    for j in data:
        data1.append(int(j))
    apart.append(data1)

visited = [[0] * N for i in range(N)]
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]


def bfs(a, b, count1):
    queue = deque()
    queue.append([a, b])
    visited[a][b] = count1
    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < N and 0 <= ny < N:
                if visited[nx][ny] == 0 and apart[nx][ny] == 1:
                    queue.append([nx, ny])
                    visited[nx][ny] = count1


count = 0
for i in range(N):
    for j in range(N):
        if apart[i][j] == 0:
            continue
        if visited[i][j] != 0:
            continue
        count += 1
        bfs(i, j, count)

ans = [0] * (count + 1)
for i in range(1, count + 1):
    for j in range(N):
        for k in range(N):
            if visited[j][k] == i:
                ans[i] += 1
ans.sort()
print(len(ans) - 1)
for i in ans:
    if i != 0:
        print(i)

'알고리즘 > python' 카테고리의 다른 글

2606번 바이러스(python3)  (0) 2022.01.30
2178번 미로 탐색(python3)  (0) 2022.01.29
18405번 경쟁적 전염(python3)  (0) 2022.01.27
1715번 카드 정렬하기(python)  (0) 2022.01.27
1316번 그룹 단어 체커(python3)  (0) 2022.01.25