[알고리즘] BFS

박주현·2023년 10월 12일
0

알고리즘

목록 보기
2/2

오늘은 지난 포스팅에 이어서 BFS에 대해서 정리해보려한다.

1. BFS

: 너비 우선 탐색으로 루트 노드에서 시작해서 가장 인접한 노드를 먼저 탐색하는 방식이다.
주로, 두 노드 사이의 최단 경로 또는 임의의 경로를 찾고 싶을때 사용한다.

1.1 특징

  1. 직관적이지 않음
  2. 재귀적으로 동작하지 않는다.
  3. 어떤 노드를 방문했었는지 여부를 반드시 확인하여 무한루프에 빠지는 것을 예방한다.
  4. 큐(QUEUE)를 사용하여 FIFO 즉 선입선출로 탐색한다.

1.2 과정

1.3 시간복잡도

  1. 인접행렬에서의 시간 복잡도
  • 모든 정점을 모두 방문해야하고, 연결된 인접 노드를 찾는 과정 또한 있기 때문에
  • 시간복잡도는 O(V의 2제곱)이 됩니다.
  1. 인접행렬에서의 시간 복잡도
  • 모든 정점을 모두 방문해야하고, 연결된 인접노드를 visited와 비교하기에
  • 시간복잡도는 O(V+E)가 됩니다.

1.4 예시

package etc.ThisIsCoTe;

import java.util.Scanner;

/*
N x M 크기의 얼음 틀이 있다. 구멍이 뚫려 있는 부분은 0, 칸막이가 존재하는 부분은 1로 표시된다. 구멍이 뚫려 있는 부분끼리 상,하,좌,우로 붙어 있는 경우 서로 연결되어 있는 것으로 간주한다. 이때 얼음 틀의 모양이 주어졌을 때 생성되는 총 아이스크림의 개수를 구하는 프로그램을 작성하시오.

🎁입력예시
4 5
00110
00011
11111
00000

🎊출력예시
3

전략
이 문제는 DFS 혹은 BFS로 해결 할 수 있다. (모든 정점을 방문하기만 하면 되므로 둘 다 사용 가능) 얼음을 얼릴 수 있는 공간이 상, 하, 좌, 우로 연결되어있다고 표현 할 수 있으므로 그래프 형태로 모델링 가능하다. 방문처리 영역만 카운트하면 된다.
ex.
001
010
101
 */
public class Ice {
        public static int n , m;
        // n 과 m을 최대 크기로 배열 생성
        public static int[][] graph = new int[1000][1000];

        public static boolean dfs(int x, int y){
            if(x <= -1 || x >= n || y <= -1 || y >= m){
                return false;
            }
            // 만약 노드에 아직 방문하지 않았더라면?
            if(graph[x][y] == 0){
                graph[x][y] = 1;

                dfs(x-1, y);
                dfs(x , y-1);
                dfs(x+1 , y);
                dfs(x,y+1);
            return true;
            }
        return false;
    }

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        int result = 0;
        int n = sc.nextInt();
        int m = sc.nextInt();
        // 버퍼 삭제
        sc.nextInt();

        // 2차원 리스트 맵 정보
        for (int i = 0; i < n; i++) {
            String str = sc.nextLine();
            for (int j = 0; j < m; j++) {
                if(dfs(i,j)){
                    result += 1;
                }
            }
        }
        System.out.println(result);
    }
}
profile
빌드업 막 시작하는 개발자

0개의 댓글