[JAVA][Baekjoon] 1260번 DFS와 BFS 🌟

2025. 1. 6. 13:38·Coding Test/Baekjoon
728x90
반응형

https://www.acmicpc.net/problem/1260


📌 접근 방식

1️⃣ DFS(Depth First Search):

  • 깊이 우선 탐색
    ➡️한 노드에서 가능한 멀리까지 탐색한 후, 다시 돌아와 다른 경로를 탐색하는 방법 
  • 스택 또는 재귀 호출을 활용해 구현 (이번엔 재귀 방식으로 구현!)

2️⃣ BFS(Breadth First Search):

  • 너비 우선 탐색
    ➡️ 한 노드의 인접 노드들을 모두 탐색한 후, 그다음 깊이를 탐색
  • 큐(Queue)를 사용해 구현
 

[알고리즘] 깊이 우선 탐색 : DFS(Depth-First-Search)

📌  깊이 우선 탐색이란?그래프 탐색 기법그래프 완전 탐색 기법 중 하나그래프의 시작 노드에서 출발하여 하나의 분기를 정해 최대 깊이까지 탐색이후, 탐색하지 않은 다른 분기로 이동해 탐

nyeroni.tistory.com

 

 

[알고리즘] 너비 우선 탐색 : BFS(Breadth-First-Search)

📌  너비 우선 탐색이란?그래프 탐색 기법그래프 완전 탐색 기법 중 하나그래프의 시작 노드에서 출발하여 시작 노드를 기준으로 가까운 노드를 먼저 방문하면서 탐색하는 알고리즘Queue(큐)

nyeroni.tistory.com


✅ PASS CODE

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    static ArrayList<Integer>[] A;
    static boolean[] visited;
    static int N;
    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());
        int M = Integer.parseInt(st.nextToken());
        int V = Integer.parseInt(st.nextToken());
        A = new ArrayList[N+1];
        for(int i=1; i<=N; i++) {
            A[i] = new ArrayList<Integer>();
        }
        for(int i=0; i<M; i++) {
            st = new StringTokenizer(br.readLine());
            int s = Integer.parseInt(st.nextToken());
            int e = Integer.parseInt(st.nextToken());
            A[s].add(e);
            A[e].add(s);
        }
        for(int i=1; i<=N; i++) {
            Collections.sort(A[i]);
        }
        visited = new boolean[N+1];
        DFS(V);
        System.out.println();
        visited = new boolean[N+1];
        BFS(V);
        System.out.println();
    }
    public static void DFS(int start) {
        System.out.print(start + " ");
        visited[start] = true;
        for(int i : A[start]) {
            if(!visited[i]) {
                visited[i] = true;
                DFS(i);
            }
        }
    }
    public static void BFS(int start) {
        Queue<Integer> queue = new LinkedList<Integer>();
        queue.add(start);
        visited[start] = true;

        while(!queue.isEmpty()) {
            int cur = queue.poll();
            System.out.print(cur + " ");
            for(int i : A[cur]) {
                if(!visited[i]) {
                    visited[i] = true;
                    queue.add(i);
                }
            }
        }
    }
}

💡 코드 분석

1️⃣ DFS 구현

DFS는 재귀 호출로 구현되며, 방문한 노드는 바로 출력

public static void DFS(int start) {
    System.out.print(start + " ");
    visited[start] = true; // 방문 처리
    for (int i : A[start]) { // 인접 노드 순회
        if (!visited[i]) {
            visited[i] = true; // 방문 체크
            DFS(i); // 재귀 호출
        }
    }
}

 

2️⃣ BFS 구현

BFS는 큐를 활용하여 방문 노드를 관리

public static void BFS(int start) {
    Queue<Integer> queue = new LinkedList<>();
    queue.add(start); // 시작 노드 삽입
    visited[start] = true; // 방문 처리

    while (!queue.isEmpty()) { // 큐가 빌 때까지
        int cur = queue.poll(); // 큐에서 꺼내기
        System.out.print(cur + " ");
        for (int i : A[cur]) { // 인접 노드 순회
            if (!visited[i]) {
                visited[i] = true; // 방문 체크
                queue.add(i); // 큐에 삽입
            }
        }
    }
}

3️⃣ 입력 및 초기화

그래프 크기, 간선, 시작 정점 번호를 입력받고 초기화

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int V = Integer.parseInt(st.nextToken());

간선 정보를 읽어 그래프를 구성한 뒤, 방문 배열을 초기화함

visited = new boolean[N+1];
DFS(V);
System.out.println();
visited = new boolean[N+1];
BFS(V);

반응형

🧐 느낀점

이번 문제를 통해 DFS와 BFS의 개념과 특성을 더 명확히 이해할 수 있었다! 🔍

두 탐색 방법의 차이와 적용 방식을 완전히 이해하게 되었고, 이를 바탕으로 다양한 그래프 문제를 해결할 수 있을 것 같다. 앞으로 더 복잡한 그래프 문제를 해결할 때도 알고리즘 선택과 효율성에 신경 쓰면서 코드를 개선해 나가야겠다! 💪😊

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Coding Test > Baekjoon' 카테고리의 다른 글

[JAVA][Baekjoon] 1167번 트리의 지름 🌟🌟  (0) 2025.01.06
[JAVA][Baekjoon] 2178번 미로 탐색 🌟🌟  (0) 2025.01.06
[JAVA][Baekjoon] 13023번 ABCDE 🌟🌟  (2) 2025.01.05
[JAVA][Baekjoon] 2023번 신기한 소수  (0) 2025.01.04
[JAVA][Baekjoon] 10989번 수 정렬하기 3 🌟  (0) 2025.01.04
'Coding Test/Baekjoon' 카테고리의 다른 글
  • [JAVA][Baekjoon] 1167번 트리의 지름 🌟🌟
  • [JAVA][Baekjoon] 2178번 미로 탐색 🌟🌟
  • [JAVA][Baekjoon] 13023번 ABCDE 🌟🌟
  • [JAVA][Baekjoon] 2023번 신기한 소수
예롱메롱
예롱메롱
  • 예롱메롱
    예롱이의 개발 블로그
    예롱메롱
  • 전체
    오늘
    어제
    • 전체보기 (274)
      • 프로젝트 (35)
        • Wedle (12)
        • 인스타그램 클론 코딩 (13)
        • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (10)
      • 인프런 Spring 강의 정리 (79)
        • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 .. (7)
        • Spring 핵심 원리 - 기본편 (9)
        • 모든 개발자를 위한 HTTP 웹 기본 지식 (8)
        • 자바 ORM 표준 JPA 프로그래밍 - 기본편 (11)
        • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리.. (6)
        • 실전! 스프링 부트와 JPA 활용2 - API 개.. (5)
        • 실전! 스프링 데이터 JPA (7)
        • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (7)
        • 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 (11)
        • 실전! Querydsl (8)
      • Cloud (3)
      • Spring (6)
        • spring boot (5)
        • 소셜로그인 (1)
      • Docker (2)
      • DevOps (0)
      • Coding Test (114)
        • Programmers (37)
        • Baekjoon (76)
      • KB It's Your Life 6기 (1)
      • CS (18)
        • 알고리즘 (13)
        • 컴퓨터 구조 (1)
        • Operating System (0)
        • Network (0)
        • Database (4)
      • git (1)
      • Language (15)
        • Java (5)
        • C++ (6)
        • Python (4)
    • GITHUB GITHUB
    • INSTAGRAM INSTAGRAM
  • hELLO· Designed By정상우.v4.10.3
예롱메롱
[JAVA][Baekjoon] 1260번 DFS와 BFS 🌟
상단으로

티스토리툴바