프로그래밍 공방

[백준] 2606번 : 바이러스 본문

개발/문제해결

[백준] 2606번 : 바이러스

hyosupsong 2020. 11. 5. 19:52

문제

신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.

어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.


입력

첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다.

둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다.

이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.


출력

1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.


문제해결방법

배열 혹은 연결 리스트를 사용해서 네트워크를 통해 연결된 컴퓨터를 표현해준다.

1번 컴퓨터부터 DFS, BFS를 이용해 연결된 컴퓨터들을 감염시키며 카운트한다.


코드


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
32
33
34
35
36
37
38
39
40
41
package baekjoon;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main2606_바이러스 {
    public static int N;
    public static int virus = 0;
    public static int[][] map;
    public static boolean[] v;
    
    // DFS
    public static void spread(int index) {
        v[index] = true;
        virus++;
        for(int i=0; i<N; i++) {
            if(index==i) continue;
            if(map[index][i]!=0 && !v[i]) spread(i);
        }
    }
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        map = new int[N][N];
        v = new boolean[N];
        int M = Integer.parseInt(br.readLine());
        StringTokenizer st;
        // 배열을 통해 네트워크로 연결된 컴퓨터를 표시
        for(int i=0; i<M; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken())-1;
            int b = Integer.parseInt(st.nextToken())-1;
            map[a][b] = 1;
            map[b][a] = 1;
        }
        spread(0);
        System.out.println(virus-1);
    }
}
cs

코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.