[문제링크]
https://www.acmicpc.net/problem/2606
[문제]
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.
예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.
어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.
[입력]
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하인 양의 정수이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.
[출력]
1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.
[예제 입력 1]
7
6
1 2
2 3
1 5
5 2
5 6
4 7
[예제 출력 1]
4
[설명]
BFS, DFS의 전형적인 문제이다.1과 연결된 번호마다 돌며 visited = false인 곳에서만 cnt를 더해준다.
백준 알고리즘 2606번 JAVA풀이
import java.util.*;
public class BJ2606 {
public static int cnt = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int[][] arr = new int[N+1][N+1];
boolean[] visited = new boolean[N+1];
for(int i=0;i<M;i++){
int a = sc.nextInt();
int b = sc.nextInt();
arr[a][b]=1;
arr[b][a]=1;
}
visited[1]=true;
dfs(1, N, visited, arr);
System.out.println(cnt);
}
public static void dfs(int p, int N, boolean[] visited, int[][] arr) {
for(int i=1;i<=N;i++){
if(arr[p][i]==1 && !visited[i]){
cnt++;
visited[i]=true;
dfs(i, N, visited, arr);
}
}
}
}
궁금하신 부분이나 부족한 점은 댓글로 알려주시면 감사하겠습니다.
'알고리즘 > DFS_BFS' 카테고리의 다른 글
BJ S2 1260 DFS와 BFS - Java (1) | 2025.01.12 |
---|---|
BJ S2 11724 연결요소의개수 - Java (2) | 2024.10.09 |
BJ S2 21736 헌내기는 친구가 필요해 - Java (0) | 2024.10.02 |
BJ G5 7569 토마토 - Java (1) | 2024.10.01 |
BJ_G4_14502_연구소 - Java (0) | 2022.10.07 |
댓글