알고리즘

[백준(BOJ)] 2667번 단지번호붙이기

욘아리 2024. 1. 10. 22:47

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

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

지도를 보고 연결된 집의 모임을 단지로 정의하고, 각 단지에 번호를 붙여 총 단지수와 단지 내 집의 수를 출력하는 문제다.

예시

Example 1:

Input: 7
	0110100
	0110101
	1110101
	0000111
	0100000
	0111110
	0111000
Output: 3
	7
	8
	9

풀이

n = int(input())
# 지도
grid = []
for _ in range(n):
    grid.append(list(map(int, input().rstrip())))
# 상하좌우 이동을 위한 방향 설정
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
# 단지 내 집의 수
cnt = 0

def dfs(x, y):
    global cnt
    if x < 0 or x >= n or y < 0 or y >= n:
        return False
  # 현재 위치가 집인 경우 cnt 증가하고 0으로 바꿔서 방문했음을 표시
    if grid[x][y] == 1:
        cnt += 1
        grid[x][y] = 0
	# 상하좌우 이동하며 dfs 수행
        for i in range(4):
            dfs(x + dx[i], y + dy[i])
        # 단지 내의 모든 집을 탐색한 경우 True 반환
        return True
  # 현재 위치가 집이 아닌 경우 False 반환
    return False

res = []

for i in range(n):
    for j in range(n):
    # 현재 위치가 집이면 dfs 수행하고 cnt를 결과 리스트에 추가
        if dfs(i, j):
            res.append(cnt)
            # cnt 초기화
            cnt = 0
res.sort()
print(len(res))
for r in res:
    print(r)