본문 바로가기
Algorithm_PYTHON

[백준_파이썬]2667번_단지번호붙이기

by 코리니덕 2021. 8. 24.
# 깊게 들어가니까 dfs사용

# 움직여야 하니까 방향설정
dx = [1, -1, 0, 0]
dy = dx[::-1]

n = int(input())
# map정보 입력받기
maps = [list(map(int, input())) for _ in range(n)]
# 방문했는지 확인하기 위한 행렬
visited = [[0] * n for _ in range(n)]

def dfs(x,y):
    global cnt

    #  이 함수가 발동 됐다는 것은 집이 있는 곳으로 온 것(집 1개) - 집 세기
    cnt += 1
    
    # 집이 있을 때, 해당 함수가 동작하는 것이므로 방문표시
    visited[x][y] = 1

    # 방향 탐색
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]

        # 범위 안에 있다면
        if 0 <= nx < n and 0 <= ny < n:
            # 집이 있고, 방문하지 않았다면
            if maps[nx][ny] == 1 and visited[nx][ny] == 0:
                # 더 깊게 가주기
                dfs(nx, ny)


# 한 단지 내에서 집의 갯수
cnt = 0
# 단지 내에 집이 몇개씩 있는지 담을 배열
houses = []
for i in range(n):
    for j in range(n):
        # 집이 있고, 방문하지 않았을 때만 dfs수행
        if maps[i][j] == 1 and visited[i][j] == 0:
            cnt = 0
            dfs(i, j)
            houses.append(cnt) # dfs함수를 통해 하나의 단지를 다 세고 온 것
            

print(len(houses))
houses.sort()
print('\n'.join(map(str, houses)))