ygreenb
yellowgreenblue
ygreenb
전체 방문자
오늘
어제
  • TIL (130)
    • Algorithm & Data Structure (70)
      • 이론 (4)
      • 프로그래머스 (54)
      • 백준 (12)
    • JAVA (4)
    • Android Studio (9)
    • Database (1)
    • WEB (25)
      • HTML+CSS (7)
      • Javascript (5)
      • React (11)
      • Django (1)
      • Node.js (1)
    • Computer Vision (13)
    • Git (8)

블로그 메뉴

  • HOME
  • TAG
  • GITHUB

공지사항

인기 글

태그

  • Android
  • stack
  • 스택/큐
  • Arrays.sort()
  • 안드로이드
  • reactjs
  • 코틀린
  • HashMap
  • greedy
  • 깃허브
  • 백준
  • 해시
  • React
  • 프로그래머스 Lv.2
  • getOrDefault
  • 깃
  • entrySet
  • BFS
  • DP
  • compareTo()
  • Comparator
  • sort
  • dfs
  • git
  • 프로그래머스
  • Queue
  • java
  • PriorityQueue
  • kotiln
  • git bash

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ygreenb

yellowgreenblue

Algorithm & Data Structure/백준

[JAVA] 백준 1260번 : DFS와 BFS

2020. 5. 23. 04:02
 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

문제

그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램.

단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.

 

입력

- 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V

- 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호

어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

 

출력

- 첫째 줄에 DFS를 수행한 결과

- 다음 줄에는 BFS를 수행한 결과를 출력

V부터 방문된 점을 순서대로 출력하면 된다.

 

풀이

 

DFS(깊이우선) 는 재귀나 스택으로 (보통 재귀를 사용한다), BFS(너비우선)는 큐로 해결한다.

간선들이 연결되어 있는지 아닌지 판단할 때, 인접행렬이나 인접리스트를 이용한다.

인접행렬 사용시 시간 복잡도 : O(V^2)
인접리스트 사용시 시간 복잡도 : O(V+E)
이므로 인접리스트를 사용하여 푸는 것이 좋다. 인접행렬은 연결되어있으면 1, 연결되어있지 않으면 0 으로 처리하는 것으로 구현과 이해가 쉽다는 장점이 있지만, 정점의 개수(여기선 N)가 늘면 늘수록 탐색하는 시간이 오래걸린다는 단점이 있다.양방향 간선이기 때문에 ArrayList<ArrayList>를 사용해서 하나의 간선을 입력받을 시 반대 간선도 같이 저장 시켜주어야한다.

밑에서는 인접리스트로 구현

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class bj1260 {
  static private List<List<Integer>> adjacencyList;
  static boolean[] visited;

  public static void main(String args[]) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String[] input = br.readLine().split(" ");
    int N = Integer.parseInt(input[0]); // 정점 개수
    int M = Integer.parseInt(input[1]); // 간선 개수
    int V = Integer.parseInt(input[2]); // 탐색 시작할 정점

    visited = new boolean[N + 1];
    adjacencyList = new ArrayList<>(N + 1);
    for (int i = 0; i <= N; i++) {
      adjacencyList.add(new ArrayList<>());
    }

    // 그래프 초기화
    for (int i = 0; i < M; i++) {
      input = br.readLine().split(" ");
      int a = Integer.parseInt(input[0]);
      int b = Integer.parseInt(input[1]);
      adjacencyList.get(a).add(b);
      adjacencyList.get(b).add(a);
    }

    for (int i = 1; i <= N; i++) {
      Collections.sort(adjacencyList.get(i));
    }

    dfs(V);
    visited = new boolean[N + 1];
    System.out.println();
    bfs(V);
  }

  public static void dfs(int v) {
    visited[v] = true;
    System.out.print(v + " ");

    for (int neighbor : adjacencyList.get(v)) {
      if (!visited[neighbor]) {
        dfs(neighbor);
      }
    }
  }

  public static void bfs(int v) { // queue
    Queue<Integer> queue = new LinkedList<>();
    queue.offer(v);
    visited[v] = true;

    while (!queue.isEmpty()) {
      int currentV = queue.poll();
      System.out.print(currentV + " ");

      List<Integer> neighbors = adjacencyList.get(currentV);
      for (int neighbor : neighbors) {
        if (!visited[neighbor]) {
          visited[neighbor] = true;
          queue.offer(neighbor);
        }
      }
    }
  }
}

'Algorithm & Data Structure > 백준' 카테고리의 다른 글

[JAVA] 백준 11724번 : 연결 요소의 개수  (0) 2020.05.23
[JAVA] 백준 1026번 : 보물  (0) 2020.05.22
[JAVA] 백준 1890번 : 점프  (0) 2020.05.22
[JAVA] 백준 3036번 : 링  (0) 2020.05.17
[JAVA] 백준 2609번 : 최대공약수와 최소공배수  (0) 2020.05.17
    'Algorithm & Data Structure/백준' 카테고리의 다른 글
    • [JAVA] 백준 11724번 : 연결 요소의 개수
    • [JAVA] 백준 1026번 : 보물
    • [JAVA] 백준 1890번 : 점프
    • [JAVA] 백준 3036번 : 링
    ygreenb
    ygreenb
    개발공부기록장

    티스토리툴바