Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- have a nice day
- 네트워크
- 우유아야
- 텐션 업 10기!
- 자료구조
- SSAFY 화이팅
- DFS
- 텐션 업 10기 화이팅
- 모르고리즘
- BFS
- 수학
- HAVE A GOOD DAY
- 아자아자 화이팅
- Have a nice day.
- 우유가 옆으로 넘어지면 아야
- SeongSeobDang
- 코로나 싫어요
- Have a good day :)
- 자고 싶다
- Java 환경 설정
- SSAFY IM/A
- I am Korean
- SSAFY 테스트
- SSAFY 10기 화이팅
- DP
- Hamming weight
- 우유가옆으로넘어지면아야
- amazon
- LeetCode #릿코드 #좋은 하루 되세요 #Have a nice day
Archives
- Today
- Total
Hope Everyone Is Happy
[실버2] 11724. 연결 요소의 개수(Java) 본문
※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)
[실버2] 11724. 연결 요소의 개수(Java)
J 크 2023. 9. 11. 21:12728x90
반응형
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
DFS 시작,,
※ 문제를 요약하면 아래와 같습니다.
▶ 방향 없는 그래프에서 연결 요소의 갯수를 구하기 (== 그래프가 몇 세트 있는지 구하기)
▶ Input : 첫째 줄에 정점의 갯수 N, 간선의 갯수 M 입력, 이후 M개의 줄에서 간선의 양 끝점 u와 v제공
▶ Output : 연결 요소의 갯수 출력
◈ Input - 1
6 5
1 2
2 5
5 1
3 4
4 6
◈ Output - 1
2
◈ Input - 2
6 8
1 2
2 5
5 1
3 4
4 6
5 4
2 4
2 3
◈ Output - 2
1
◎ 코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.
▶ 그래프 탐색을 위해 방문 배열을 N+1 사이즈 만큼 선언 (0번방은 제외)
▶ 그래프 탐색을 DFS로 진행, DFS 탐색 완료 후 방문 배열이 남아있다 == 아직 그래프가 더있다
▶ 그래프를 인접리스트로 구현, DFS는 재귀로 진행
Input-1 그래프 그림 예시 )
Input-1 인접 리스트 예시 )
▶ DFS의 첫 재귀함수가 끝날 때마다 카운트
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));
static boolean[] barrVisited;
static ArrayList<Integer>[] arrList;
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bReader.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
barrVisited = new boolean[N + 1];
arrList = new ArrayList[N + 1]; // 인접 리스트
for (int i = 1; i <= N; i++)
arrList[i] = new ArrayList<Integer>();
for (int i = 0; i < M; i++) {
st = new StringTokenizer(bReader.readLine());
int nParent = Integer.parseInt(st.nextToken());
int nChild = Integer.parseInt(st.nextToken());
// 양방향 연결
arrList[nParent].add(nChild);
arrList[nChild].add(nParent);
}
int nCount = 0;
// 연결되있는 갯수 만큼 DFS 탐색을 하게 된다.
// DFS의 탐색 횟수 == 연결 요소의 개수
for (int i = 1; i <= N; i++) {
if (!barrVisited[i]) {
nCount++;
DFS(i);
}
}
bWriter.write(String.valueOf(nCount));
bWriter.flush();
bWriter.close();
}
public static void DFS(int nNode) throws IOException {
if (barrVisited[nNode]) {
return;
}
// 인접리스트에 해당하는 곳을 방문안했으면 탐색하자
barrVisited[nNode] = true;
for (int i = 0; i < arrList[nNode].size(); i++) {
if (!barrVisited[arrList[nNode].get(i)]) {
DFS(arrList[nNode].get(i));
}
}
}
}
재밌군여~
Good Luck! (피드백 감사합니다!)
'※ 백준 (Baekjoon) > [Java] 문제 풀이 ( Solve the problems)' 카테고리의 다른 글
[골드3] 1520. 내리막길 (0) | 2023.09.13 |
---|---|
[실버1] 2667. 단지 번호 붙이기 (Java) (0) | 2023.09.12 |
[골드4] 17298. 오큰수 (Java) (0) | 2023.09.10 |
[골드5] 2493. 탑 (Java) (0) | 2023.09.09 |
[골드5] 5430. AC (Java) (0) | 2023.09.08 |