n = int(input()) # n * n 행렬
graph = [list(map(int, input())) for _ in range(n)]
# 상하좌우 이동
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
apart = [] # 각 단지별 집 수 저장
count = 0 # 집 수 저장
# 단지 파악
def dfs(x, y):
global count
# 행렬 범위 벗어나는 경우
if x < 0 or y < 0 or x >= n or y >= n:
return False
# 집인 경우
if graph[x][y] == 1:
graph[x][y] = 0 # 방문 처리
count += 1 # 집 개수 카운트
# 상하좌우 이동
for i in range(4):
dfs(x + dx[i], y + dy[i])
return True
return False
# 모든 요소에 대해서 탐색
for i in range(n):
for j in range(n):
if dfs(i, j):
# 탐색이 끝나면 해당 단지에 대해서 집의 개수가 count에 저장된다.
apart.append(count)
count = 0 # count 초기화
apart.sort() # 오름차순 정렬
print(len(apart), *apart, sep='\n') # 개행출력
왜 count는 global 키워드를 사용하고 graph는 global 키워드를 사용하지 않았을까?
파이썬에서 mutable object에 대해서는 global 키워드가 필요없기 때문이다. 그렇다면 mutable object는 무엇일까?
1) mutable object
출처. Understanding Mutable and Immutable in Python
mutable object의 정의는 내부 상태를 바꿀 수 있는 객체를 말한다. mutable object와 immutable object의 종류는 다음과 같다.
Objects of built-in type that are mutable are:
Objects of built-in type that are immutable are:
2) 주의 사항
data = ['a', 'b', 'c']
def f():
data = data + [1, 2, 3]
return data
print(f())
위 코드에 경우에 data는 mutable object인 list이기 때문에 문제없어 보이지만 이것은 내부 상태를 변경하는 것이 아닌 동일한 이름의 data라는 local variable을 만드는 것이다. 따라서 + 연산에 사용된 data가 ['a', 'b', 'c'] 요소를 가진 외부 data 변수가 아닌 함수 f()내에서 찾으므로 UnboundLocalError가 발생한 것이다.