백준

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

빙수빈수 2023. 10. 5. 18:48

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

 

11724번: 연결 요소의 개수

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어

www.acmicpc.net

[문제]

방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.

 

[입력 조건]

  • 첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.

 

[코드]

import java.util.*;

public class BaekJoon_11724 {
	static ArrayList<ArrayList<Integer>> graph=new ArrayList<>();
	static int n,m,result=0;
	static boolean[] visited;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();
		m=sc.nextInt();
		
		visited=new boolean[n+1];
		for(int i=0;i<=n;i++)
			graph.add(new ArrayList<>());
		
		for(int i=0;i<m;i++) {
			int a=sc.nextInt();
			int b=sc.nextInt();
			
			graph.get(a).add(b);
			graph.get(b).add(a);
		}
		
		// 방문하지 않은 노드를 시작으로 연결된 모든 노드 탐색
		for(int i=1;i<=n;i++) {
			if(!visited[i]) {
				dfs(i);
				result++; // 집단의 개수 증가
			}
		}
		System.out.println(result);
	}
	
	// 연결된 노드를 모두 방문처리 하는 함수
	static void dfs(int start) {
		for(int next:graph.get(start)) {
			if(!visited[next]) {
				visited[next]=true;
				dfs(next);
			}
		}
	}
}

 

[고찰]

 이번 문제는 그래프 문제로 연결된 노드의 덩어리를 찾는 문제였다. DFS 알고리즘으로 탐색 시작 노드와 연결된 모든 노드를 방문처리 해주면 되는 간단한 문제였다.

'백준' 카테고리의 다른 글

[백준_4963번] 섬의 개수  (1) 2023.10.05
[백준_10451번] 순열 사이클  (0) 2023.10.05
[백준_7490번] 0 만들기  (0) 2023.09.26
[백준_2018번] 수들의 합 5  (0) 2023.09.24
[백준_1863번] 스카이라인 쉬운거  (0) 2023.09.24