반응형
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
- express
- MySQL완전삭제
- 백준 등수매기기
- 백준알파벳파이썬
- 도커 컨테이너
- 백준 A->B
- jenkins
- 백준 점프
- 1987파이썬
- 지도자동구축 파이썬
- 백준 바이러스
- 등수매기기 파이썬
- CRUD
- 백준 점프 파이썬
- 피아노체조 파이썬
- 파이썬 평범한배낭
- MongoDB
- 백준 전쟁-전투
- 프로그래머스
- 백준 피아노체조
- 백준 평범한배낭
- 백준
- express mongodb
- 금고털이 파이썬
- 파이썬데이터분석라이브러리
- 백준 전쟁 파이썬
- 백준 예산
- 소프티어 장애물인식프로그램
- 장애물인식프로그램 파이썬
- 소프티어 지도자동구축
Archives
- Today
- Total
바위 뚫는중
[BOJ] 백준 11724. 연결요소 개수 구하기 본문
반응형
https://www.acmicpc.net/problem/11724
시간제한: 3초
레벨: 실2
연결요소?
→ 에지로 연결된 노드의 집합으로, 한 번의 DFS가 끝날 때까지 탐색한 노드의 집합을 하나의 연결 요소로 판단할 수 있음
풀이
선언, 입출력
static ArrayList<Integer>[] A;
static boolean visited[];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
주어진 정수만큼의 크기를 가진 노드를 초기화, 값 받아오기
A = new ArrayList[n+1]; // n+1 만큼의 배열을 가진 배열리스트 A
visited = new boolean[n+1];
// 주어진 정수만큼의 노드를 초기화시킨다
for (int i = 1; i < n+1; i++) {
A[i] = new ArrayList<Integer>();
}
//연결요소는 양방향에지이므로 값을 받아들이면 양쪽에 이를 더해준다
//모든 관계를 반복
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
A[x].add(y);
A[y].add(x);
}
연결요소의 개수를 구하기 위해 탐색 수행! 한번의 탐색이 끝날때까지 탐색한 노드의 집합이 연결요소 이므로 탐색이 끝나면 카운트를 세준다.
int count = 0;
//모두 방문할때까지 반복, 방문했다면 루프 빠져나오기
for (int i = 1; i < n+1; i++) {
if(!visited[i]) { // 방문하지 않았다면
count ++;
DFS(i); // 너비우선탐색을 실행
}
} //end
System.out.println(count);
}
// DFS로직
static void DFS(int v) {
if(visited[v]) { //방문했으면 나오기
return;
}
visited[v] = true; // 방문했다고 표시하기
for(int i: A[v]) { // 배열안에 있는 것을 차례로 순회
if(visited[i] == false) { // 방문안했으면 방문
DFS(i);
}
}
}
전체코드
/**
* 백준 연결 요소의 개수 구하기 DFS
*
*/
package b11724;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
// 사용할 배열리스트, 방문한지 체크할 boolean 선언
static ArrayList<Integer>[] A;
static boolean visited[];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
A = new ArrayList[n+1]; // n+1 만큼의 배열을 가진 배열리스트 A
visited = new boolean[n+1];
// 주어진 정수만큼의 노드를 초기화시킨다
for (int i = 1; i < n+1; i++) {
A[i] = new ArrayList<Integer>();
}
//연결요소는 양방향에지이므로 값을 받아들이면 양쪽에 이를 더해준다
//모든 관계를 반복
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
A[x].add(y);
A[y].add(x);
}
int count = 0;
//모두 방문할때까지 반복, 방문했다면 루프 빠져나오기
for (int i = 1; i < n+1; i++) {
if(!visited[i]) { // 방문하지 않았다면
count ++;
DFS(i); // 너비우선탐색을 실행
}
} //end
System.out.println(count);
}
// DFS로직
static void DFS(int v) {
if(visited[v]) { //방문했으면 나오기
return;
}
visited[v] = true; // 방문했다고 표시하기
for(int i: A[v]) { // 배열안에 있는 것을 차례로 순회
if(visited[i] == false) { // 방문안했으면 방문
DFS(i);
}
}
}
}
반응형
'Algorithms > 백준' 카테고리의 다른 글
[BOJ] 백준 9461. 파도반 수열, DP (0) | 2023.09.02 |
---|---|
[BOJ] 백준 10814. 나이순 정렬, Comparator (0) | 2023.09.02 |
[BOJ] 백준 2979. 트럭주차 (0) | 2023.08.30 |
[BOJ] 백준 10709. 기상캐스터 (0) | 2023.08.27 |
[BOJ] 백준 1157. 단어 공부 (2) | 2023.08.27 |