import sys
def isVisitable(x, y):
if x < 0 or x >= len_map or y < 0 or y >= len_map:
return False
if list_map[y][x] == 1:
return True
else:
return False
def visitAll(x_pos, y_pos):
global list_map
visit_count = 1
visit_list = [(x_pos, y_pos)]
list_map[y_pos][x_pos] = 0
x_list = [1, -1, 0, 0]
y_list = [0, 0, 1, -1]
while len(visit_list) != 0:
a, b = visit_list.pop()
for (x, y) in zip(x_list, y_list):
new_x = a + x
new_y = b + y
if isVisitable(new_x, new_y):
# print(new_x,new_y, "visitable")
list_map[new_y][new_x] = 0
visit_list.append((new_x, new_y))
visit_count += 1
return visit_count
len_map = int(sys.stdin.readline())
list_map = []
for _ in range(len_map):
a = list(map(int, list(sys.stdin.readline().strip())))
list_map.append(a)
answer = list()
for i in range(len_map):
for j in range(len_map):
if isVisitable(i, j):
# print(i,j)
visit_count = visitAll(i, j)
answer.append(visit_count)
answer.sort()
print(len(answer))
for ans in answer:
print(ans)
isVisitable(x,y)
: x, y 위치의 점에 집이 있으면 true, 없으면 false 값을 return 한다.
visitAll(x,y)
: 주어진 x,y와 연결된 모든 위치를 방문하여 집이 있는 지 확인하고, 방문한 곳을 모두 0 (집이 없는 것처럼) 만든다. 집이 있는 위치의 개수를 return 한다.
import sys
n = int(sys.stdin.readline())
houses = [list(map(int, list(sys.stdin.readline().rstrip()))) for i in range(n)]
answer = list()
def checkList(a, b):
ans = list()
if a > 0:
ans.append([a - 1, b])
if a < n - 1:
ans.append([a + 1, b])
if b > 0:
ans.append([a, b - 1])
if b < n - 1:
ans.append([a, b + 1])
return ans
def exist(x):
a, b = x
return True if houses[a][b] == 1 else 0
def check(list_, visited):
a, b = list_
visited.append([a, b])
new_visit = []
new_visit.append(list_)
global houses
for dot in checkList(a, b):
if exist(dot) and dot not in visited:
new_visit.extend(check(dot, visited))
return new_visit
def delete(list_):
global houses
for dot in list_:
x, y = dot
houses[x][y] = 0
for i in range(n):
for j in range(n):
if exist([i, j]):
x = check([i, j], [])
answer.append(len(x))
delete(x)
print(len(answer))
answer.sort()
for i in answer:
print(i)
최근 것보다 좀 더 오래걸렸다. 최근 건 방문한 집을 0으로 바꿨고, 여기에선 방문한 집을 visited 라는 list에 저장하여 방문 여부를 판단했다. 여기에서 함수를 좀 더 깔끔하게 쓴 것 같다.
strip()
: 문자열 양끝 공백문자 제거
rstrip()
: 문자열 오른쪽 공백문자 제거
lstrip()
: 문자열 왼쪽 공백문자 제거