이번 문제는 처음 시도에는 깊이우선탐색으로 접근하였다. 방문처리 리스트 대신에 paper리스트 자체에서 확인한 인덱스를 0으로 바꿔주면서 그 영역의 넓이까지 카운팅하는 방식으로 재귀함수를 호출하였다. 이 방식으로 빠르게 해결할 수 있었다.
import sys
sys.setrecursionlimit(10**9)
def dfs(y, x, cnt):
paper[y][x]=0
for i in range(4):
ny=y+dy[i]
nx=x+dx[i]
if ny>=0 and nx>=0 and ny<n and nx<m:
if paper[ny][nx]==1:
cnt=dfs(ny, nx, cnt+1)
return cnt
n, m=map(int, input().split())
paper=[]
for _ in range(n):
paper.append(list(map(int, input().split())))
dy=[0, 0, -1, 1]
dx=[1, -1, 0, 0]
answer=0
cnt=0
for i in range(n):
for j in range(m):
if paper[i][j]==1:
answer=max(answer, dfs(i, j, 1))
cnt+=1
print(cnt)
print(answer)
그러나 이 과정에서 메모리 초과가 계속 발생하였다. 메모리를 줄이는 방법으로 코드를 수정하고 제출하기를 여러번 시도했지만 도저히 메모리 초과 문제를 해결할 수 없었다. 그래서 찾아본 결과 입력의 크기가 n(1 ≤ n ≤ 500), m(1 ≤ m ≤ 500)이기 때문에 재귀로는 해결할 수 없다는 사실을 알게 되었다. DFS를 공부하고 있었기 때문에 DFS로 풀고 싶었지만 더 빠른 BFS로 풀게 되었다.
BFS도 DFS로 접근한 방식과 별반 다르지는 않았다. DFS에서 재귀호출 하는 대신에 BFS에서는 큐에 값을 넣어주는 방식으로 탐색을 진행하게 된다.
paper[y][x]
를 0으로 갱신한다.q.popleft()
의 반환값을 저장한다.y+dy[i]
를 저장한다.x+dx[i]
를 저장한다.paper[ny][nx]
가 1일 경우,paper[ny][nx]
를 0으로 갱신한다. (방문처리)paper[i][j]
가 1일 경우,from collections import deque
def bfs(y, x):
paper[y][x]=0
q=deque()
q.append((y,x))
cnt=1
while q:
y, x=q.popleft()
for i in range(4):
ny=y+dy[i]
nx=x+dx[i]
if ny>=0 and nx>=0 and ny<n and nx<m and paper[ny][nx]==1:
q.append((ny, nx))
paper[ny][nx]=0
cnt+=1
return cnt
n, m=map(int, input().split())
paper=[]
for _ in range(n):
paper.append(list(map(int, input().split())))
dy=[0, 0, -1, 1]
dx=[1, -1, 0, 0]
answer=0
cnt=0
for i in range(n):
for j in range(m):
if paper[i][j]==1:
answer=max(answer, bfs(i, j))
cnt+=1
print(cnt)
print(answer)