본문 바로가기
알고리즘 문제/백준

[백준] 1260번: DFS와 BFS

by Lpromotion 2024. 7. 16.

💡문제 분석 요약

입력받은 그래프의 정보를 DFS와 BFS로 탐색한 결과를 출력하는 문제이다.

  • 시간 제한: 2초
  • 메모리 제한: 128MB

 

💡알고리즘 설계

  • 그래프 정보를 인접 행렬로 저장한다.
  • DFS 구현
    • 재귀 함수를 이용한다.
    • 방문한 노드를 visited = true(방문 체크)로 설정하고 StringBuilder에 저장한다.
    • 해당 노드와 인접한 노드 중 방문하지 않은 노드(visited == false)를 재귀 호출한다.
  • BFS 구현
    • 큐를 이용한다.
    • 시작 노드를 큐에 넣고 visited = true 로 설정한다.
    • 큐가 빌 때까지 다음을 반복한다.
      • 큐에서 맨 앞 노드를 꺼내고, StringBuilder에 저장한다.
      • 꺼낸 노드와 인접한 노드 중 방문하지 않은 노드를 큐에 넣고 visited = true 로 설정한다.

 

💡코드

import java.io.*;
import java.util.*;

public class Main {

    static StringBuilder sb = new StringBuilder();
    static boolean[] visited;
    static int[][] arr;

    static int N, M, V;

    static Queue<Integer> q = new LinkedList<>();

    static void DFS(int v) {
        visited[v] = true;
        sb.append(v).append(" ");
        for(int i=0; i<arr.length; i++) {
            if(arr[v][i] == 1 && !visited[i]) {
                DFS(i);
            }
        }
    }

    static void BFS(int v) {
        Queue<Integer> q = new LinkedList<>();
        q.offer(v);
        visited[v] = true;

        while(!q.isEmpty()) {
            int current = q.poll();
            sb.append(current).append(" ");
            for(int i=0; i<arr.length; i++) {
                if(arr[current][i] == 1 && !visited[i]) {
                    q.offer(i);
                    visited[i] = true;
                }
            }
        }
    }

    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());
        M = Integer.parseInt(st.nextToken());
        V = Integer.parseInt(st.nextToken());

        arr = new int[N+1][N+1];
        for(int i=0; i<M; i++) {
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            arr[x][y] = 1; arr[y][x] = 1;
        }

        visited = new boolean[N+1];
        DFS(V); sb.append("\\n");

        visited = new boolean[N+1];
        BFS(V);

        System.out.println(sb);
        br.close();;
    }
}

 

💡시간복잡도

  • DFS: $O(N^2)$
  • BFS: $O(N^2)$

⇒ 전체 시간복잡도 $O(N^2)$

 

💡 틀린 이유

그래프를 배열로 받아오는 과정에서 정점이 1부터 시작하는 것을 간과하고 배열 크기를 N으로 설정해서 인덱스 오류가 발생했다.

 

💡 틀린 부분 수정

배열 크기를 [N+1][N+1] 로 수정했다.

arr = new int[N+1][N+1]; 

DFS와 BFS 메서드에서 반복문도 1부터 시작하도록 수정했다.

for(int i=1; i<arr.length; i++) {
    ...
}

 

💡 느낀점 or 기억할정보

DFS의 개념 정리를 할 때 인접 리스트를 이용해 구현 코드를 작성해서, 이 문제를 해결할 때는 인접 행렬이 더 적절하다는 것을 알아내는데 시간이 걸렸다. 문제마다 주어지는 그래프의 표현 방식이 다르기 때문에 문제에 적잘한 방법을 사용할 수 있도록 익숙해져야 할 것 같다.

반응형

댓글