[백준] 2606번: 바이러스 [C++]

tae0·2023년 12월 31일

문제 설명

백준 2606: 바이러스

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

예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.
어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.

문제 분석

바이러스가 걸린 컴퓨터와 연결된 컴퓨터는 바이러스에 걸리게 되며, 1번 컴퓨터에 의해 바이러스가 걸리는 컴퓨터의 수를 출력하는 문제이다. 여러 갈래로 컴퓨터들이 연결되어 있으므로 그래프 관련 문제라 생각했고, 1번 컴퓨터에 의해 바이러스가 걸린 컴퓨터 수를 출력하는 문제이므로 DFS 방식, BFS 방식 모두 사용 가능하다 판단해서 인접 행렬을 이용한 그래프와 재귀를 이용한 DFS 방식을 사용했다.

처음 작성한 코드

#include <iostream>

using namespace std;

int computer[101][101] = { 0, };
bool virus[101];
int com, edges, cnt = 0;

void dfs(int v) {
	virus[v] = true;
	
	for (int i = 0; i < com; i++) {
		if (!virus[i] && computer[v][i] == 1) {
			dfs(i);
			cnt++;
		}
	}
}

int main(void) {
	int c1, c2;
	cin >> com >> edges;

	for (int i = 0; i < edges; i++) {
		cin >> c1 >> c2;
		computer[c1][c2] = 1;
		computer[c2][c1] = 1;
	}

	dfs(1);
	cout << cnt;
}


위 코드가 틀린 이유를 계속 찾다가 dfs 함수 내부 for문의 조건식이 이상하다는 것을 알았다. 예를 들어서, com이 7로 입력되었을 경우, 컴퓨터1 ~ 컴퓨터7까지 존재하는 것인데 나는 컴퓨터0 ~ 컴퓨터6까지 반복문을 돌리고 있었던 것이다...

아래는 수정한 코드이다

수정한 코드

#include <iostream>

using namespace std;

int computer[101][101] = { 0, };
bool virus[101];
int com, edges, cnt = 0;

void dfs(int v) {
	virus[v] = true;
	
	for (int i = 1; i <= com; i++) {
		if (!virus[i] && computer[v][i] == 1) {
			dfs(i);
			cnt++;
		}
	}
}

int main(void) {
	int c1, c2;
	cin >> com >> edges;

	for (int i = 0; i < edges; i++) {
		cin >> c1 >> c2;
		computer[c1][c2] = 1;
		computer[c2][c1] = 1;
	}

	dfs(1);
	cout << cnt;
}

profile
초보 개발자.. 매일 공부한 거 적는게 목표

0개의 댓글