• Home

My Codegate

  • Home

백준 1260 DFS와 BFS 자바 문제풀이

2024/01/19 Posted by Codegate Java No Comments
백준 1260 DFS와 BFS 자바 문제풀이

문제 링크

문제 내용으로는 입력으로 정점, 간선 수 시작 위치를 받은 뒤 이후 정점간 연결 구조를 받은 뒤, 시작 위치에서부터 시작해서 양방향 그래프를 DFS와 BFS 방식으로 돌아준 후 방문 순서를 찍어주면 되는데

주의할 점은 방문할 수 있는 정점이 여러개라면 정점 번호가 작은 것(오름차순)부터 방문해야 한다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;

public class Main{

  static Map<Integer, ArrayList<Integer>> graph = new HashMap<>();
  static LinkedHashSet<Integer> dfsVisited = new LinkedHashSet<>();
  static LinkedHashSet<Integer> bfsVisited = new LinkedHashSet<>();

  public static void dfs(int start) {
    dfsVisited.add(start);
    if (graph.get(start) != null) {
      for (int neighbor : graph.get(start)) {
        if (!dfsVisited.contains(neighbor)) {
          dfs(neighbor);
        }
      }
    }
  }

  public static void bfs(int start) {
    Queue<Integer> queue = new LinkedList<>();
    queue.add(start);
    bfsVisited.add(start);

    while (!queue.isEmpty()) {
      Integer poll = queue.poll();
      if (graph.get(poll) != null) {
        for (int neighbor : graph.get(poll)) {
          if (!bfsVisited.contains(neighbor)) {
            queue.add(neighbor);
            bfsVisited.add(neighbor);
          }
        }
      }
    }
  }

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    // Vertex Edge Start
    int[] split = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();

    for (int i = 0; i < split[1]; i++) {
      int[] edge = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
      graph.putIfAbsent(edge[0], new ArrayList<>());
      graph.putIfAbsent(edge[1], new ArrayList<>());
      graph.get(edge[0]).add(edge[1]);
      graph.get(edge[1]).add(edge[0]); // 양방향
    }

    for (ArrayList<Integer> neighbor : graph.values()) {
      Collections.sort(neighbor);
    }

    dfs(split[2]);
    StringBuilder sb = new StringBuilder();
    for (int i : dfsVisited) {
      sb.append(i).append(" ");
    }
    System.out.println(sb.substring(0, sb.length() - 1));

    bfs(split[2]);
    StringBuilder sb2 = new StringBuilder();
    for (int i : bfsVisited) {
      sb2.append(i).append(" ");
    }
    System.out.println(sb2.substring(0, sb2.length() - 1));

  }
}

DFS와 BFS 둘 다 사용할 줄 알아야 풀 수 있는 문제인데, 사용할 줄 안다면 주의할 점은 그래프에 간선 다 넣어주고 난 뒤에 정렬해주는 부분만 추가로 해 주면 되고

BFS의 경우에는 재귀, BFS의 경우에는 Queue를 사용해서 문제를 풀어주면 되겠다.

No Comments
0

Leave a Reply Cancel Reply

Introduction

My Codegate

Latest Posts

  • Google Search Console API 연동방법
  • 인텔리제이 Gradle Dependency 최신 버전 보는 방법
  • Wallet-Tracker 개발일지
  • Moralis API 자바로 호출방법
  • IntelliJ Commit 후 Push 따로 하는 방법

Categories

  • My Project (4)
  • Java (42)
  • Algorithm (161)
    • Java (152)
    • Algorithm Knowledge (3)
    • Algorithm site usage (6)
  • Vue.js (1)
  • Spring (4)
  • Docker (2)
  • IntelliJ (20)
  • Uncategorized (7)

Recent Comments

  • Codegate on Hello world!
  • A WordPress Commenter on Hello world!

© 2025 — mycodegate.com

Prev Next