일단 문제를 해결하기위해 생각한 방법으로는 일반적인 미로찾기 방법을 살짝 변형해서 집이 있는 곳이라면 dfs 함수를 호출하고 해당 단지를 다 돌때까지 while문을 돌도록 코드를 작성해주었다.
이런 방식으로 코드를 작성해서 예시 답완과 같은 출력이 나오는데까지에는 성공했는데 예외로 인해 틀렸습니다가 떴다.
그 이유는 dfs 를 처음으로 호출해줄때 넣어주는 좌표에 대해서 방문처리를 해준 후 while문을 돌렸어야 했는데 그렇게 하지 않아서 문제가 발생했다.
from collections import deque
def dfs(graph,a,b):
q = deque()
q.append((a,b))
home_cnt = 0
dx = [-1,1,0,0]
dy = [0,0,-1,1]
home_cnt+=1
#이 부분으로 인해 예외에 걸림
graph[a][b] +=1
while(q):
x,y = q.popleft()
for i in range(4):
nx = dx[i] + x
ny = dy[i] + y
if 0 <= nx < n and 0<= ny < n and graph[nx][ny] == 1:
q.append ((nx,ny))
home_cnt+=1
#visited 대신 값을 변경하여 방문여부 체크
graph[nx][ny] +=1
return home_cnt
n = int(input())
graph = []
for i in range(n):
graph.append(list(map(int, input())))
home_list = []
for i in range(n):
for j in range(n):
if graph[i][j] == 1:
home_list.append(dfs(graph, i,j))
print(len(home_list))
# for i in range(n):
# print(graph[i])
for h in sorted(home_list):
print(h)
*예외 처리를 안해줄때
입력:
5
10000
00011
00001
11000
11101
출력:
4
[1, 0, 0, 0, 0]
[0, 0, 0, 2, 2]
[0, 0, 0, 0, 2]
[2, 2, 0, 0, 0]
[2, 2, 2, 0, 1]
1
1
4
6
*예외처리 해준 후
입력:
5
10000
00011
00001
11000
11101
출력:
4
[2, 0, 0, 0, 0]
[0, 0, 0, 2, 2]
[0, 0, 0, 0, 2]
[2, 2, 0, 0, 0]
[2, 2, 2, 0, 2]
1
1
3
5
예외처리를 안해주면 처음 좌표와 마지막좌표가 방문처리가 안되는 것을 볼 수 있다.
예외처리에 대해서 잘 생각하면서 코드를 작성해야겠다.