[백준] 2606 바이러스 (C++)
2606 | 바이러스
🙋♀️ 문제
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.
예를 들어 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
🚀 코드
#include <iostream>
#include <vector>
#include <list>
#include <string>
#include <algorithm>
using namespace std;
bool find(vector<int> v, int x) {
// 컴퓨터의 개수가 100개 이하이므로
// 반복문을 통해 요소가 있는지 확인
bool flag = false;
for (int i = 0; i < v.size(); i++) {
if (v[i] == x) {
flag = true;
break;
}
}
return flag;
}
void rDFS(vector<int> *graph, int v, vector<int> *cnt) {
if (graph[v].empty()) {
// 연결된 정점이 더이상 없으면 재귀문 탈출
return;
}
for (int i = 0; i < graph[v].size(); i++) {
if (!find(*cnt, graph[v][i])) {
// 바이러스에 걸리지 않았을 때만 삽입
(*cnt).push_back(graph[v][i]);
rDFS(graph, graph[v][i], cnt);
}
}
return;
}
int main() {
int v, e = 0;
cin >> v >> e;
// 변수의 개수만큼 배열을 동적으로 생성
// 벡터(=list) 배열을 선언하여 v*e개의 행렬처럼 사용해 그래프를 표현
vector<int> * graph = new vector<int>[v + 1];
for (int i = 0; i < e; i++) {
int from, to;
cin >> from >> to;
graph[from].push_back(to);
graph[to].push_back(from);
}
vector<int> cnt; // 바이러스에 걸린 컴퓨터는 배열에 넣고 이후에 배열의 크기를 구한다
rDFS(graph, 1, &cnt);
cout << cnt.size() - 1;
return 0;
}
🌠 메모
vector를 linked-list
처럼 사용해서 그래프를 표현했다.
양방향 그래프이므로 연결된 정점의 양쪽에 모두 push 한다. 또한 중복되는 컴퓨터는 세지 않기 위해 cnt vector를 사용하고, 요소가 포함되어 있는지 확인하기 위해 find()
함수를 작성했다. (algorithm 의 find도 사용할 수 있었지만 동작 방식이 동일해서 그냥 새로 만들었다.)
탐색은 재귀 함수를 이용해서 모든 연결된 정점들을 확인하며 감염되지 않은 컴퓨터를 cnt 벡터에 삽입하는데, 양방향 그래프이므로 시작 컴퓨터인 1이 포함되기 때문에 마지막에 1 을 빼고 출력한다.
# 카테고리
- BOJ 36
- Algorithm 12
- CodingTest 11
- Web 9
- Javascript 8
- Vue 7
- React 7
- DBProject 4
- Python 3
- Tech-interview 3
- Express 3
- Next 3
- Github 2
- Django 2
- C 1
- C++ 1
- WebGame 1