Baekjoon/DFS와 BFS

[백준] 1926 그림 (실버1) / BFS, 런타임에러(ValueError) 해결

hellosonic 2023. 4. 19. 13:32

문제요약

나의 코드 및 설명

  • DFS로는 런타임 에러가 발생하여 BFS로 풀었다.
from collections import deque

def bfs(x,y):
    global size
    queue = deque()
    queue.append((x,y))
    size = 1
    visited[y][x] = 1 #현재 좌표 방문처리
    board[y][x] = 0 #방문한 현재 좌표에 0 저장

    while queue:
        x,y = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx<0 or ny<0 or nx>=m or ny>=n:
                continue
            else:
                if board[ny][nx] == 1 and visited[ny][nx] == 0:
                    visited[ny][nx] = 1
                    board[ny][nx] = 0
                    size += 1
                    queue.append((nx,ny))
                    

n, m = map(int, input().split()) #세로n 가로m

board = []
for _ in range(n):
    board.append(list(map(int, input().split())))

dx = [0,1,0,-1]
dy = [1,0,-1,0]
visited = [[0] * m for _ in range(n)]
size = 0
max_size = 0
count = 0
for i in range(n):
    for j in range(m):
        if board[i][j] == 1:
            bfs(j, i)
            if max_size < size:
                max_size = size
            
            size = 0
            count += 1

print(count,max_size,sep="\n")

 

피드백

좌(런타임에러) - 리스트에 bfs 실행 후 리턴값을 저장 / 우(패스) - bfs 실행 후 변수에 저장

처음엔 나에게 더 익숙한 DFS로 풀어보려고 했으나 예제입력에 대한 출력값은 정상적으로 나왔지만 런타임 에러가 발생했다. 이럴 경우 BFS로 풀면 된다는 것을 몸소 체험할 수 있었다. DFS, BFS의 시간 복잡도는 모든 노드를 탐색한다는 점에서 동일하지만 BFS가 재귀함수로 구현하는 DFS보다 조금 더 빠르다고 한다.

BFS로 다시 도전해서 맞을 수 있었는데 며칠 뒤 다시 풀어보려고 하니까 런타임 에러가 발생했다. 맞는 것 같은데 왜 에러가 발생하지.. 고민하다가 결국 원인을 찾아냈는데, BFS를 실행한 후의 값을 리스트에 저장해서 사용하려고 하니까 런타임 에러(ValueError)가 발생했다..(머지...) 변수에 저장하니까 정답 판정을 받을 수 있었따.  >> 에러의 원인이 이게 아니었다. 문제를 보면 그림이 하나도 없는 경우에는 가장 넓은 그림의 넓이는 0 이라고 하였다. 즉, 그림이 하나도 없는 경우에는 ans_list = []이게 되고, 빈 리스트에서 max 메서드를 사용하다 보니 런타임 에러(ValueError)가 발생하는 것이다. ans_list가 비어있는 경우(그림이 하나도 없는 경우) 0이 출력될 수 있도록 조건문을 작성하여 제출해보았더니 정답 판정을 받을 수 있었다.