0%

BOJ 2667

Input

첫 번째 줄에는 지도의 크기 N(정사각형이므로 가로와 세로의 크기는 같으며 5≤N≤25)이 입력되고,

그 다음 N줄에는 각각 N개의 자료(0혹은 1)가 입력된다.

1
2
N = int(input())
apt = [list(int(c) for c in input()) for _ in range(N)]

DFS

  • 배열의 요소를 하나씩 방문하면서, 1일 경우 위/아래/왼/오가 1인지 체크하고,
  • 1일 경우, 방문했던 곳이 아니라면 동일한 방법으로 체크한다.
1
2
3
visited = [[False]*N for _ in range(N)] # apt for문 돌면서 중복해서 방문하지 않도록 체크

dir = [[0,1], [0,-1], [1,0], [-1,0]]
1
2
3
4
5
for i in range(N):
for j in range(N):
if apt[i][j] == 1 and not visited[i][j]:
count = 0
dfs(i, j)
1
2
3
4
5
6
7
for d in dir:
y = dy + d[0]
x = dx + d[1]

if 0 <= y < N and 0 <= x < N:
if apt[y][x] and not visited[y][x]:
dfs(y, x)
  • 이 때, 단지별 아파트 개수를 출력하기 위해 count+1 을 수행한다.
1
2
3
4
def dfs(dy, dx):
visited[dy][dx] = True
global count
count += 1
  • apt[i][j] == 0 or visited[i][j] == True 이면 더 이상 dfs 를 호출하지 않고, 이는 즉 단지가 구성되었음을 의미
  • 다음 단지로 넘어가기 전 sort 를 사용하기 위해 list에 count를 append한다.
1
2
3
4
if apt[i][j] == 1 and not visited[i][j]:
count = 0
dfs(i, j)
countList.append(count)

Output

첫 번째 줄에는 총 단지수를 출력하시오.

그리고 각 단지내 집의 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력하시오.

1
2
3
4
countList.sort()
print(len(countList))
for num in countList:
print(num)