Post

백준 2667번 단지번호붙이기

숫자열을 입력 받고 받은 숫자열을 가로 세로끼리 이어서 하나의 묶음을 만들어야 한다 문제에서는 하나의 묶음을 단지로 표현했다 하나의 좌표에서 왼쪽 오른쪽 위아래로 움직였을때 만약 해당 위치의 값이 1이라면 서로 이어진 곳이다 이렇게 이어진 곳이 몇개있는지 알아내는 문제이다

입력할 때 띄어쓰기로 구분이 되어있지 않아서 그 부분도 해결해야한다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from collections import deque
import sys
input = sys.stdin.readline

dx = [0,0,1,-1]
dy = [1,-1,0,0]
 
n = int(input())
line = []
cnt = []
q =deque()

for _ in range(n): #숫자를 하나씩 리스트에 넣는 방법 문자열로 바꾼뒤에 맨뒤 개행문자를 소거한다
    line.append(list(map(int,str(input())[:-1] )))

#처음부터 탐색을 하는데 1을 만나면 주변을 탐색한다 (만약 이미 방문한곳이면 패스 값을 0으로 바꾼다 ) 1을 주변에 전부 체크한뒤에 돌아오고
#다시 탐색을 실시한다

for i in range(n):
    for j in range(n):
        
        if line[i][j]: #숫자가 1인 경우
            line[i][j] = 0 #방문을 표시
            count = 1
            q.append([i,j])
            while q:
                k = q.popleft()
                for e in range(4):
                    nx = k[0] + dx[e]
                    ny = k[1] + dy[e]
                    if nx < 0 or nx >= n or ny < 0  or ny >= n:
                        continue
                    
                    if line[nx][ny] == 1:
                        line[nx][ny] = 0
                        q.append([nx,ny])
                        count += 1
            cnt.append(count)

            
cnt.sort()
print(len(cnt))
for i in cnt:
    print(i)
                
This post is licensed under CC BY 4.0 by the author.