DFS/BFS 구현 시 큐에 넣기 전에 방문 처리 할 것

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)

'프로그래밍' 카테고리의 다른 글

BFS 알고리즘 (백준 2021번: 최소 환승 경로)  (0) 2024.08.02
유니온 파인드 알고리즘 (백준 1717: 집합의 표현)  (0) 2024.02.03
다익스트라 알고리즘 (백준 1753번: 최단경로)  (0) 2024.01.23
공간이 연속 할 경우 합치기  (0) 2024.01.22
파이썬3의 딕셔너리의 keys() 메서드 반환 값은 리스트가 아니야.  (0) 2024.01.08
'프로그래밍' 카테고리의 다른 글
  • 유니온 파인드 알고리즘 (백준 1717: 집합의 표현)
  • 다익스트라 알고리즘 (백준 1753번: 최단경로)
  • 공간이 연속 할 경우 합치기
  • 파이썬3의 딕셔너리의 keys() 메서드 반환 값은 리스트가 아니야.
virbr0.net
virbr0.net
  • virbr0.net
    virbr0.net
    virbr0.net
  • 전체
    오늘
    어제
    • 분류 전체보기
      • SIP
      • HTTP
      • OS
      • 프로그래밍
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    가상화
    다익스트라
    인증서
    인터넷전화
    파이썬
    RTP
    HTTP
    클라우드
    RDP
    IIS
    alteon
    셀프칭찬
    브로드웍스
    파일명 없이 다운로드
    유기농 배추
    SIP
    SBC
    DFS
    파일명
    시간복잡도
    chunked
    rtp inject
    BFS
    회사생활
    딕셔너리
    URL Rewrite
    윈도우서버
    ADC
    해외발신
    최단경로
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
virbr0.net
DFS/BFS 구현 시 큐에 넣기 전에 방문 처리 할 것
상단으로

티스토리툴바