Stay Hungry Stay Foolish

BOJ 코딩테스트/Silver

BOJ 2606번 : 바이러스 (C++, Python/Silver 3)

dev스카이 2023. 2. 19. 00:16
 

2606번: 바이러스

첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어

www.acmicpc.net

문제

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

예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.

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

 

입력

첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.

 

출력

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


예제 입력

7
6
1 2
2 3
1 5
5 2
5 6
4 7

예제 출력

4

문제 설명

1번 컴퓨터에서부터 연결된 컴퓨터들이 웜 바이러스에 걸렸는지 확인하고 그 개수를 출력한다.

Solution

C++

#include <iostream>
using namespace std;
#define MAX 101

int C, net, cnt = 0; //컴퓨터 개수, 연결된 컴퓨터 쌍, 감염된 컴퓨터를 카운트
int adj[MAX][MAX]; //인접 행렬
bool visited[MAX]; //방문 확인 여부

void DFS(int n){
    visited[n] = true; //true = 방문했다는 걸 표시
    for(int i=1; i <= C; i++){ //방문한 것과 연결되어 있는 지 확인
        if(adj[n][i] == 1 && visited[i] == 0){ //연결되어 있고, 방문을 아직 안 했다면
            cnt++; //감염된 컴퓨터 카운트
            DFS(i); //감염된 컴퓨터와 다른 컴퓨터가 연결되어 있는지 확인하기 위해 재귀로 돌리기
        }
    }
}
int main() {
    cin >> C >> net;
    for(int i=0; i <net; i++){
        int a, b;
        cin >> a >> b;
        adj[a][b] = 1;
        adj[b][a] = 1;
    }
    DFS(1); //1번 컴퓨터만 바이러스가 걸렸으니 1로 시작한다.
    cout << cnt;

    return 0;
}

Python

from collections import deque

C, N = int(input()), int(input()) #컴퓨터 수, 컴퓨터 쌍의 수
adj = [[] for _ in range(C + 1)] #이중 리스트
visited = [False for _ in range(C + 1)] #방문 표시 확인 하기 위한 리스트(False로 초기화)

for _ in range(N):
    a, b = map(int, input().split())
    adj[a].append(b) #톱니형 리스트(가로 크기가 불규칙), append로 동적 생성 가능
    adj[b].append(a) #연결 돼 있다는 것을 체크하기 위해 번갈아 가면서 값을 넣는다.

def BFS(x):
    deq = deque([x]) #큐에 1이 들어감
    cnt = 0 #바이러스 먹은 컴퓨터 개수
    visited[x] = True #방문 표시

    while deq:
        n = deq.popleft() #왼쪽에서 값을 빼냄
        for i in adj[n]: #n이 1일 때 1과 연결된 것부터 확인
            if visited[i] == False: #방문하지 않았다면
                visited[i] = True #방문 표시하기
                deq.append(i) #오른쪽에 값을 추가한다.
                cnt += 1
    return cnt

print(BFS(1))