ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘] BFS
    Algorithm/theory 2022. 9. 20. 22:28

    변수 설명

    board = 판

    vis = 방문 여부

    n,m 각각 행과 열의 개수

    dx,dy = 상하좌우 처리 위한 변수

     

    1. (0,0) 방문 처리 후 큐에 추가

    2. 상하좌우 살피며 큐에 추가

    3. 큐의 front를 cur에 저장 후 pop

    4. dx,dy를  활용하여 상하좌우 탐색

    (대부분 x가 행 , y 가 열을 의미함)

    5. dx,dy 가 범위에 있는지 부터 확인 중요(처리 안 할 시에 런타임 에러남)

     

    자주 하는 실수

    1. 시작점에 방문했다는 표시를 남기지 않음

    2. 큐에 넣을 때 방문했다는 표시를 하는 대신 큐에서 빼낼 때 방문했다는 표시를 남김 -> 시간초과 혹은 메모리 초과 발생

    3. 이웃한 원소가 범위를 벗어났는지에 대한 체크를 잘못 함

     

    bfs 문제

    기본

    1926: 그림

    더보기

    1. 상하좌우로 연결된 그림의 크기를 알아내기

    2. 도화지에 있는 모든 그림을 찾아내기 => 이중 for문을 사용하여 시작 위치 찾기

    3. 각 칸이 queue에 한번씩만 들어가므로 시간 복잡도는 o(nm) 

     

    응용1 - 거리측정

    2178: 미로 탐색

    더보기

    최단 경로의 길이 찾기 문제. bfs를 이용해 모든 경로의 최단 경로를 찾을 수 있음

    시작점에서 현재 위치까지의 거리를 현재 원소 위치에 저장

    초기화를 -1로 하면 vis 배열을 두지 않아도 됨

     

     

    응용2 - 시작점 여러개

    7578: 토마토

    더보기

    일반 bfs 문제처럼 풀이를 진행 한다면 시간 복잡도: bfs 탐색 O(nm) * 익은 토마토의 최대 개수 O(NM) = O(N^2M^2) 가 되어 시간초과 발생

    처음에 익은 토마토를 queue에 모두 집어넣고 bfs 진행

    마지막에 -1이 있는지 여부를 꼭 확인해야 함

     

    응용3 - 시작점이 두 종류일 때

    4179: 불!

    'Algorithm > theory' 카테고리의 다른 글

    [코딩 테스트] 탐색  (0) 2022.09.14
    [개념] 문자열  (0) 2022.08.28
    [개념] Backtracking  (0) 2022.08.23
Designed by Tistory.