본문 바로가기
JAVA/자료구조, 알고리즘

JAVA BFS DFS 알고리즘

by wanna_dev 2024. 1. 15.

c++로만 구현했던 BFS와 DFS의 코드입니다.

자세한 설명은 아래 글을 참고해주세요.

https://wannadev.tistory.com/96

 

BFS, DFS c++

- DFS란, 그래프 전체를 탐색하는 하나의 방법으로써, 하나의 가지(branch)를 모두 탐색한 이후에 다음 branch로 이동하는 방법이다. - 시작 노드에서 깊이가 커지는 방향으로 탐색을 진행하여 더 이

wannadev.tistory.com

https://wannadev.tistory.com/116

 

BFS, DFS 활용 문제 고찰

BFS 문제를 많이 접하다 보니, BFS 문제 유형에 대해서 생각해보게 되었다. 나는 문제를 일반화 시키는 것을 선호한다. 만능은 없지만 정답에 가까워지기 편하기 때문이다. 먼저 그래프를 사용해

wannadev.tistory.com

 

 

코드 

 

 

 

dfs

import java.util.*;
import java.io.*;

public class Main {
    static int m;
    static int n;
    static int[][] graph;
    static class Node {
        int x;
        int y;
        public Node(int n, int m) {
            this.x = n;
            this.y = m;
        }
    }
    static int[] dx = {1,-1,0,0};
    static int[] dy = {0,0,1,-1};

    static boolean dfs(int x, int y) {
        if (x<0 || x>=m || y<0 || y>=n) {
            return false;
        }
        if (graph[x][y] == 1) {
            graph[x][y] = 0;
            for (int i = 0; i < 4; i++) {
                int nx = dx[i] + x;
                int ny = dy[i] + y;
                dfs(nx,ny);
            }
            return true;
        }
        return false;
    }
    public static void main(String[] args) throws FileNotFoundException {
        //System.setIn(new FileInputStream("./input.txt"));
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for (int i = 0; i < t; i++) {
            m = sc.nextInt(); n = sc.nextInt(); int k = sc.nextInt();
            graph = new int[m][n];
            for (int j = 0; j < k; j++) {
                int x = sc.nextInt(); int y = sc.nextInt();
                graph[x][y] = 1;
            }
            int ans = 0;
            for (int j = 0; j < m; j++) {
                for (int l = 0; l < n; l++) {
                    if (graph[j][l] == 1) {
                        dfs(j, l);
                        ans++;
                    }
                }
            }
            System.out.println(ans);
        }
    }
}

 

 

BFS

import java.util.*;
import java.io.*;

public class Main {
    static int m;
    static int n;
    static class Node {
        int x;
        int y;
        public Node(int n, int m) {
            this.x = n;
            this.y = m;
        }
    }
    static int[] dx = {1,-1,0,0};
    static int[] dy = {0,0,1,-1};

    static int[][] bfs(int x, int y, int[][] g) {
        Deque<Node> q = new ArrayDeque<>();
        g[x][y] = 0;

        q.add(new Node(x,y));
        while (!q.isEmpty()) {
            Node node = q.pollFirst();
            for (int i = 0; i < 4; i++) {
                int nx = dx[i] + node.x;
                int ny = dy[i] + node.y;
                if (0<=nx && nx<m && 0<=ny&& ny<n) {
                    if (g[nx][ny] == 1) {
                        g[nx][ny] = 0;
                        q.addLast(new Node(nx,ny));
                    }
                }
            }
        }
        return g;
    }
    public static void main(String[] args) throws FileNotFoundException {
        //System.setIn(new FileInputStream("./input.txt"));
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for (int i = 0; i < t; i++) {
            m = sc.nextInt(); n = sc.nextInt(); int k = sc.nextInt();
            int[][] graph = new int[m][n];
            for (int j = 0; j < k; j++) {
                int x = sc.nextInt(); int y = sc.nextInt();
                graph[x][y] = 1;
            }
            int ans = 0;
            for (int j = 0; j < m; j++) {
                for (int l = 0; l < n; l++) {
                    if (graph[j][l] == 1) {
                        graph = bfs(j, l, graph);
                        ans++;
                    }
                }
            }
            System.out.println(ans);
        }
    }
}