카테고리 없음
DFS/BFS 구현 시 큐에 넣기 전에 방문 처리 할 것
virbr0.net
2024. 1. 10. 01:36
백준 1012번: 유기농 배추 ( https://www.acmicpc.net/problem/1012 )
파이썬으로 풀이하다가 깨달은 사실이다.
먼저 아래와 같이 구현해 보았다.
def bfs(_x, _y):
q = deque()
q.append((_x, _y))
while q:
vx, vy = q.popleft()
arr_map[vx][vy] = 0
for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
nx, ny = vx + dx, vy + dy
if 0 <= nx < M and 0 <= ny < N and arr_map[nx][ny] == 1:
q.append((nx, ny))
BFS 를 구현하기 위해
1. 최초 방문지를 큐에 추가
2. 큐에서 방문하지 않은 곳이 있다면, 큐에서 뺀다음 방문처리
3. 그리고 4방향 탐색
과 같이 구현하였다.
큐에서 빼면서 방문처리를 하니 계속 시간초과가 났다.
계속 보다 깨달았다.
BFS나 DFS 구현 시, 방문처리는 큐에서 뺄때가 아니라 큐에 넣을 때 해야된다는 사실을...
큐에 뺄 때 방문처리하면, 경우에 따라 큐에서 빼는 순서에 따라 이미 큐에 있는 곳을 다시한번 방문해서 큐에 넣는 경우가 발생하는 것을 알게 되었다.
BFS 함수를 아래와 같이 큐에 넣고 바로 방문 처리하는 것으로 수정 후 통과하였다.
def bfs(_x, _y):
q = deque()
q.append((_x, _y))
arr_map[_x][_y] = 0
while q:
vx, vy = q.popleft()
for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
nx, ny = vx + dx, vy + dy
if 0 <= nx < M and 0 <= ny < N and arr_map[nx][ny] == 1:
q.append((nx, ny))
arr_map[nx][ny] = 0
전체 적인 BFS 를 활용한 풀이는 아래와 같다.
import sys
from collections import deque
input = sys.stdin.readline
def bfs(_x, _y):
q = deque()
q.append((_x, _y))
arr_map[_x][_y] = 0
while q:
vx, vy = q.popleft()
for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
nx, ny = vx + dx, vy + dy
if 0 <= nx < M and 0 <= ny < N and arr_map[nx][ny] == 1:
q.append((nx, ny))
arr_map[nx][ny] = 0
T = int(input())
for _ in range(T):
M, N, K = map(int, input().split())
arr_map = [[0] * N for _ in range(M)]
ans = 0
for _ in range(K):
x, y = map(int, input().split())
arr_map[x][y] = 1
for x in range(M):
for y in range(N):
if arr_map[x][y] == 1:
ans += 1
bfs(x, y)
print(ans)