백준 풀이/자바(Java)

백준 1260 자바 - DFS와 BFS

콘스_ 2024. 5. 2. 15:59
// DFS와 BFS
package Silver_II_2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Ex1260 {
    
    static StringBuilder sb = new StringBuilder();
    static boolean[] check; // 탐색했던 노드인지 검사하기 위한 배열
    static int[][] arr; // 노드 간의 간선을 표현해 주기 위한 표
    
    static int node, line, start; // 정점의 개수, 간선의 개수, 탐색을 시작할 정점의 번호
    
    static Queue<Integer> queue = new LinkedList<>();
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        node = Integer.parseInt(st.nextToken());
        line = Integer.parseInt(st.nextToken());
        start = Integer.parseInt(st.nextToken());

        arr = new int[node+1][node+1];
        check = new boolean[node+1];

        for (int i = 0; i < line; i++) {
            st = new StringTokenizer(br.readLine());

            int a = Integer.parseInt(st.nextToken()); // 간선이 연결하는 정점의 번호 1
            int b = Integer.parseInt(st.nextToken()); // 간선이 연결하는 정점의 번호 2

            arr[a][b] = arr[b][a] = 1; // 인접 행렬 방법
        }

        dfs(start);
        sb.append("\n");
        check = new boolean[node+1]; // check 배열 초기화

        bfs(start);

        System.out.println(sb);
    }

    static void dfs(int start) { // 깊이 우선 탐색 메서드 실행
        check[start] = true; // 탐색 했으므로 true
        sb.append(start + " ");

        for (int i = 0; i <= node; i++) {
            if (arr[start][i] == 1 && !check[i]) { // 노드가 존재하고 탐색하지 않았을 떄
                dfs(i);
            }
        }
    }

    static void bfs(int start) { // 너비 우선 탐색
        queue.add(start);
        check[start] = true; // 탐색 했으므로 true

        while (!queue.isEmpty()) {

            start = queue.poll();
            sb.append(start + " ");

            for (int i = 1; i <= node; i++) {
                if (arr[start][i] == 1 && !check[i]) { // 노드가 존재하고 탐색하지 않았을 떄
                    queue.add(i);
                    check[i] = true;
                }
            }
        }
    }
}

DFS와 BFS 관련 문제는 처음 풀어본다. 처음엔 혼자서 해보려고 했지만, 갈피를 잡지 못 해서 블로그를 보고 푼 뒤에 주석을 세세히 달아서 이해하는 식으로 진행했다. 지금은 처음이라 그랬지만, 점차 익숙해지면 스스로도 가능할 것이다.
아래는 내가 본 블로그다.

[백준알고리즘-JAVA]1260번 풀이(DFS와 BFS) - 초보도 이해하는 풀이 (tistory.com)

 

[백준알고리즘-JAVA]1260번 풀이(DFS와 BFS) - 초보도 이해하는 풀이

안녕하세요 인포돈 입니다. 백준 알고리즘 1260번 풀이입니다. * 참고사항 - 개발환경은 eclipse을 기준으로 작성되었습니다. - java언어를 이용하여 문제를 풀이합니다. - 알고리즘 문제는 풀이를 보

infodon.tistory.com