본문 바로가기
공부 정리/백준

[백준] 자바 11724 연결 요소의 개수

by 경적필패. 2021. 8. 6.
반응형

문제

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

입력

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

출력

첫째 줄에 연결 요소의 개수를 출력한다.


테스트 케이스

 

초록색 입력 / 검은색 출력

 


접근

1. 정점 n개와 간선 수 m 개 입력을 받습니다.

2.m번만큼 점간의 관계 입력을 받습니다. ex) 1 2 (1번점과 2번점 연결)

 

저는 2차배열에 간선 간의 관계를 먼저 저장했습니다.

그리고 visit[]배열을 이용해서 이미 지나간 정점인지 아닌지 저장했습니다.

 

방문되지 않은 점을 순차대로 돌면서 연결돼있으면 재귀 호출하여  더 연결된 점이 없는지를 탐색합니다.

이를 토대로 구현하니 문제가 해결되었습니다.

 


코드

import java.awt.desktop.SystemEventListener;
import java.io.*;
import java.math.*;
import java.util.*;

public class Main {

	/*
 	 11724 problem
	*/

	static int list[][];
	static boolean visit[];
	static int count = 0;
	static int m;
	static int n;
	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		list = new int[n+1][n+1];
		for(int i=0; i<m; i++) {
			st = new StringTokenizer(br.readLine());
			int u = Integer.parseInt(st.nextToken());
			int v = Integer.parseInt(st.nextToken());
			list[u][v] = 1;
			list[v][u] = 1;
		}
		visit = new boolean[n+1];
		
		for(int i=1; i<=n; i++) {
			if(visit[i] == false) {
				dfs(i);
				count++;
			}
		}

		bw.write(String.valueOf(count));
		bw.flush();
		br.close();
		bw.close();
	}
	private static void dfs(int a) {
		if(visit[a] == true) {
			return;
		}
		else {
			visit[a] = true;
			for(int i=1; i<=n;i++) {
				if(list[a][i] == 1) {
					dfs(i);
				}
			}
		}
	}
}

주의

연결요소란 점들 간 연결에서 분리된 모양이 몇 개인지 생각하면 편할 것 같습니다.

 

반응형

댓글