[ STUDY ]/CodingTest

백준 1260 : DFS와 BFS(오늘의 교훈 : 문제를 잘 읽자)

김강니 2024. 11. 25. 19:07

 문제

문제

그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.

 

입력

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

 

출력

첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.

 

실행 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class P1260 {
    static int N, M, V;
    static ArrayList<Integer>[] lists;
    static boolean[] visited;
    static ArrayList<Integer> DFSArr, BFSArr;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken()); //정점개수
        M = Integer.parseInt(st.nextToken()); //간선개수
        V = Integer.parseInt(st.nextToken()); //시작점

        //배열, 인접리스트 초기화
        visited = new boolean[N + 1]; //방문배열
        DFSArr = new ArrayList<>(); //DFS 순서
        BFSArr = new ArrayList<>(); //BFS 순서
        lists = new ArrayList[N + 1]; //인접리스트
        for(int i = 1; i <= N; i++) lists[i] = new ArrayList<>();

        for(int i = 0;i < M;i++) {
            st = new StringTokenizer(br.readLine());
            int n1 = Integer.parseInt(st.nextToken());
            int n2 = Integer.parseInt(st.nextToken());
            lists[n1].add(n2);
            lists[n2].add(n1);
        }
        // 정렬: 작은 번호의 노드부터 방문하기 위함
        for (int i = 1; i <= N; i++) {
            Collections.sort(lists[i]);
        }

        Arrays.fill(visited, false);
        DFS(V);
        Arrays.fill(visited, false);
        BFS(V);

        for(int i = 0; i < DFSArr.size(); i++) System.out.print(DFSArr.get(i) + " ");
        System.out.println();
        for(int i = 0; i < BFSArr.size(); i++) System.out.print(BFSArr.get(i) + " ");


    }
    public static void DFS(int V) {
        if(visited[V]) return;
        visited[V] = true;
        DFSArr.add(V);
        for(int x : lists[V]) {
            if(!visited[x]) {
                DFS(x);
            }
        }
    }

    public static void BFS(int V) {
        Queue<Integer> q = new LinkedList<>();
        q.offer(V);
        while(!q.isEmpty()) {
            int cur = q.poll();
            visited[cur] = true;
            BFSArr.add(cur);
            for(int x : lists[cur]) {
                if(!visited[x]) {
                    visited[x] = true;
                    q.offer(x);
                }
            }
        }
    }
}
 

 

'[ STUDY ] > CodingTest' 카테고리의 다른 글

백준 18111 : 마인 크래프트  (1) 2024.12.03
백준 1927 : 최소 힙  (3) 2024.11.26
11727 : 2 x n 타일링2 (DP)  (0) 2024.11.24
백준 9095 : 1, 2, 3 더하기(DP)  (0) 2024.11.23
백준 2579 : 계단 오르기(DP)  (0) 2024.11.22