개발 지식/알고리즘

[백준] 2606 바이러스

트리맨스 2019. 7. 12. 09:49
반응형



문제 : 컴퓨터 바이러스는 네트워크를 통해 전파된다. 만약 한 컴퓨터가 바이러스에 걸리면, 그 컴퓨터와 네트워크로 연결되어 있는 모든 컴퓨터는 바이러스에 감염되게 된다. 


위의 사진은 주어지는 네트워크와 컴퓨터의 구조를 예시로 든 것이며, 위의 경우에는 1번 컴퓨터가 감염되었을 때 2,3,5,6 컴퓨터가 감염이 가능한 것을 알 수 있다.


여기서, 1번 컴퓨터가 바이러스에 감염되었을 때, 1번 컴퓨터를 통해 감염될 수 있는 컴퓨터의 수를 구하시오.


입력 : 첫째 줄에는 컴퓨터의 수, 두번째 줄에는 컴퓨터 간의 네트워크 수, 마지막으로 그 수만큼 한 줄에 한 쌍씩 연결되어 있는 컴퓨터 쌍이 주어진다.

예시)

7

6

1 2

2 3

1 5

5 2

5 6

4 7


출력)

4


이 문제는 간단한 DFS 문제이다. 사실 BFS 로도 충분히 풀 수 있는데, 구현이 DFS가 조금 더 간단해서, DFS를 이용해서 풀어 보았다. 이것을 응용하면 바로 풀 수 있는 문제이다.


여기서, 그래프 탐색이란?


  • 시작 정점부터 깊이를 기준으로 모든 노드를 한 번씩 방문하는 알고리즘
  • 모든 노드를 방문하고자 할 때 쓰인다.
  • 주로 재귀 호출을 이용하여 구현한다.


간단히 위의 사진을 이용해 DFS 구현 과정을 나타내자면 1-2-3-5-6 순으로 탐색할 것이다. 시작 노드는 1, 그 다음 순서의 노드는 2 이다. 다음 시작 노드는 2, 그 다음 순서의 노드는 3이다. 다음 시작 노드는 3, 그 다음 순서의 노드는 4가 나와야 하지만 연결되어 있지 않으므로, 다음 노드는 5 이다. 이러한 식으로 순차적으로 탐색하는 방법이다.

만약 해당 노드를 탐색했다면, 탐색한 노드는 방문했다는 표시를 해 두어야 다시 탐색하는 불상사가 없다. 이 문제는 시작 노드 1을 제외한 나머지 노드의 수 (컴퓨터의 수) 를 출력해야 하는 프로그램이므로, 탐색을 할 때마다 +1 을 해주면 간단하게 답이 나온다.


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
#include <stdio.h>
 
int com[101][101]={0};
int visit[101]={0}; 
int viruscom=0;
 
void dfs(int start,int net)
{
    int i;
    
    visit[start]=1;
    viruscom++;
 
    for(i=1;i<=net;i++)
    {
        if(com[start][i]==1 && visit[i]==0)
        {
            dfs(i,net);
        }
    }
    
    return;
}
 
int main()
{
    int num,net,x,y;
    scanf("%d",&num);
    scanf("%d",&net);
    for(int i=0;i<net;i++)
    {
        scanf("%d %d",&x,&y);
        com[x][y]=1;
        com[y][x]=1;
    }
    
    dfs(1,num);
    printf("%d",viruscom-1);
}
cs


반응형

'개발 지식 > 알고리즘' 카테고리의 다른 글

[백준] 2588 곱셈  (0) 2019.12.23
[백준] 2753 윤년  (0) 2019.12.18
[백준] 2884 알람 시계  (0) 2019.06.30
[백준] 4673 셀프 넘버  (0) 2019.06.30
[백준] 11720 숫자의 합  (0) 2019.06.15