고코딩

[백준 1260번] DFS와 BFS 본문

코딩테스트

[백준 1260번] DFS와 BFS

고코딩 2021. 1. 13. 17:52

문제

그래프를 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.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
    static class Graph{
        //정점의 갯수
        int v;
        LinkedList<Integer>[] nodes;    //정점을 연결할 연결리스트

        //생성자
        public Graph(int v) {
            this.v = v+1;
            nodes = new LinkedList[this.v];
            for(int i=0;i<this.v;i++)
                nodes[i] = new LinkedList();
        }

        //간선 생성
        public void addEdge(int v, int w) {
            nodes[v].add(w);
            nodes[w].add(v);
        }
        //너비우선탐색BFS생성
        //재귀함수 아님, 큐 이용해서 큐에 있는 애들 출력
        public void BFS(int s) {
            //방문한 애들 확인할 배열 생성
            boolean [] visited = new boolean[this.v];

            //큐생성
            Queue<Integer> queue = new LinkedList<Integer>();

            //지금 방문한 s방문한거 확인하고 큐에 삽입
            visited[s] = true;
            queue.add(s);

            //큐가 빌떄까지 돌림
            //큐에서 노드를 하나 빼냄
            //빼낸 노드의 인접한 노드들중 방문하지 않는 노드들을 큐에 삽입
            while(!queue.isEmpty()) {
                int q = queue.poll();
                System.out.print(q+" ");

                //인접한 정점이 많을경우 수가 작은 것부터 확인해야해서 정렬
                LinkedList<Integer> sortnodes = nodes[q];
                Collections.sort(sortnodes);
                Iterator<Integer> i = sortnodes.listIterator();
                //인접한 노드들 검사
                while(i.hasNext()) {
                    int n = i.next();

                    if(!visited[n]) {
                        queue.add(n);
                        visited[n] = true;
                    }
                }
            }
        }

        //깊이 우선 탐색DFS 끝까지 들어가서 확인
        //s 노드부터 깊이 우선 탐색
        //재귀함수 사용
        public void DFS(int s) {
            //방문한 노드 확인용 배열 처음에 다 false초기화
            boolean [] visited = new boolean[this.v];

            visited[s] = true;

            System.out.print(s+" ");

            DFSUtil(s, visited);
        }
        public void DFSUtil(int s, boolean[] visited) {
            //먼저 현재 노드 방문한 것이니 true체크
            visited[s] = true;

            //현재 노드의 주변 노드들 가져오
            LinkedList<Integer> sortnodes = nodes[s];
            Collections.sort(sortnodes);
            Iterator<Integer> i = sortnodes.listIterator();


            //주변 노드중 방문 안한 노드 있으면 방문 
            //방문하기 전에 출력하고 방문
            while(i.hasNext()) {
                int n = i.next();
                if(!visited[n]) {
                    System.out.print(n+" ");
                    DFSUtil(n,visited);
                }
            }
        }
    }
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuffer sf = new StringBuffer();

        String[] NMV = br.readLine().split(" ");

        Graph g = new Graph(Integer.parseInt(NMV[0]));

        int m = Integer.parseInt(NMV[1]);
        for(int i=0; i<m; i++) {
            String [] nodes = br.readLine().split(" ");
            g.addEdge(Integer.parseInt(nodes[0]), Integer.parseInt(nodes[1]));
        }

        int v = Integer.parseInt(NMV[2]);
        g.DFS(v);
        System.out.println();
        g.BFS(v);


        br.close();
        bw.flush();
        bw.close();
    }
}

'코딩테스트' 카테고리의 다른 글

[백준 2667번] 단지번호붙이기  (0) 2021.01.14
[백준 2178번] 미로 탐색  (0) 2021.01.14
[백준 2504번] 괄호의 값  (0) 2021.01.12
[백준 4949번] 균형잡힌 세상  (0) 2021.01.11
[백준 11279번] 최대 힙  (0) 2021.01.11