• Home

My Codegate

  • Home

백준 24444 알고리즘 수업 – 너비 우선 탐색 1 자바 문제풀이

2024/01/16 Posted by Codegate Java No Comments
백준 24444 알고리즘 수업 - 너비 우선 탐색 1 자바 문제풀이

문제 링크

문제 내용은 입력으로 정점, 간선, 시작 위치를 받아, 인접 정점을 오름차순으로 방문하되, 출력은 방문한 값이 아니라, 값별 방문한 순서를 찍어줘야 하는데, 방문하지 못한 값은 0을 출력해주면 된다

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.LinkedList;
import java.util.Map;
import java.util.Queue;

public class Main {

  static Map<Integer, ArrayList<Integer>> graph = new HashMap<>();
  static int[] visited;


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

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

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

    visited = new int[split[0] + 1];
    bfs(split[2]);
    for (int i = 1; i < visited.length; i++) {
      System.out.println(visited[i]);
    }

  }


  public static void bfs(int start) {
    Queue<Integer> queue = new LinkedList<>();
    queue.add(start);
    int cnt = 1;
    visited[start] = cnt++;

    while (!queue.isEmpty()) {
      Integer poll = queue.poll();
      for (int neighbor : graph.get(poll)) {
        if (visited[neighbor] != 0) {
          continue;
        }
        queue.add(neighbor);
        visited[neighbor] = cnt++;
      }
    }
  }

}

문제는 결국 BFS로 풀라고 하기 때문에, BFS로 풀어줘야 하는데, 주의할 점은 오름차순으로 방문해야 하므로, graph를 구성하고 난 뒤 인접 정점을 오름차순으로 정렬해주고, 이후 bfs를 돌려줘야 하는데

이후 출력할 정답은 방문한 값이 아니라, 값별 방문한 순서이기 때문에, cnt를 1씩 올려가면서 방문한 순서를 visited 배열에 값별 위치에 꽂아주는 식으로 진행한 후

visited 배열을 1부터 시작해서 (0은 정점에 없음) 끝까지 돌려준 후 방문한 순서들을 출력해주면 끝이다.

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