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

[백준] 11724번: 연결 요소의 개수

by Lpromotion 2024. 7. 17.

💡문제 분석 요약

방향없는 그래프의 간선 정보를 입력받아, 연결 요소를 출력하는 문제이다.

  • 시간 제한: 3초
  • 메모리 제한: 512MB

 

💡알고리즘 설계

  • boolean[][] graph 에 그래프 간선 정보를 저장한다. (양방향)
  • 모든 정점을 순회하며 방문 여부 검사
    • 해당 정점을 방문하지 않은 경우 (visited[i] = false)
      • dfs 메서드 호출한다.
      • 연결 요소 개수(count)를 증가시킨다.
  • dfs 메서드
    • 현재 정점을 방문 처리한다.
    • 해당 정점과 연결된 정점이 아직 방문하지 않은 경우 (graph[index][i] && !visited[i])
      • 해당 정점을 재귀적으로 dfs 호출한다.

 

💡코드

import java.io.*;

public class Main {
    static int n, k;
    static boolean[] visited;
    static boolean[][] graph;

    static void dfs(int index) {
        visited[index] = true;
        for(int i=1; i<=n; i++) {
            if(graph[index][i] && !visited[i])
                dfs(i);
        }
    }

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

        String[] str = br.readLine().split(" ");
        n = Integer.parseInt(str[0]);
        k = Integer.parseInt(str[1]);
        graph = new boolean[n+1][n+1];
        visited = new boolean[n+1];
        for(int i=0; i<k; i++) {
            str = br.readLine().split(" ");
            int x = Integer.parseInt(str[0]);
            int y = Integer.parseInt(str[1]);
            graph[x][y] = graph[y][x] = true;
        }

        int count = 0;
        for(int i=1; i<=n; i++) {
            if(!visited[i]) {
                dfs(i);
                count++;
            }
        }

        System.out.println(count);
    }
}

 

💡시간복잡도

$O(N^2)$

 

💡 느낀점 or 기억할정보

DFS를 인접 행렬을 이용해서 풀 수 있다는 것에 조금 익숙해진 것 같다. 조금 더 난이도 있는 DFS 문제가 나오면 또 헷갈릴 수도 있을 것 같아서 문제를 많이 풀어봐야할 것 같다.

반응형

'알고리즘 문제 > 백준' 카테고리의 다른 글

[백준] 1697번: 숨바꼭질  (0) 2024.07.19
[백준] 1012번: 유기농 배추  (1) 2024.07.18
[백준] 2667번: 단지번호붙이기  (0) 2024.07.16
[백준] 1260번: DFS와 BFS  (2) 2024.07.16
[백준] 9093번: 단어 뒤집기  (1) 2024.07.16

댓글