본문 바로가기
알고리즘연습/백준

[백준] DFS와 BFS - 2606번 바이러스 java

by 밈밈무 2021. 8. 28.

문제

https://www.acmicpc.net/problem/2606

 

2606번: 바이러스

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

www.acmicpc.net

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

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

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

 

풀이

인접한 컴퓨터부터 순서대로 감염이 되기 때문에 bfs를 떠올릴 수 있는 문제지만 dfs와 bfs로 모두 풀이할 수 있는 문제이다. 이때 주의할 점이 bfs풀이법과 달리 dfs는 1번 컴퓨터를 빼주어야 하기 때문에 답을 도출해낼 때 -1을 해주어야 한다.

둘이 어떤 상황에 써야하는 건지 잘 모르겠어서 찾아보았는데

dfs - 미로 문제

bfs - 최단 경로 구하기

에 적합하다고 한다. 기억해두자!

 

코드 

package DFS와BFS;

import java.util.*;
public class No2606_바이러스 {
	static int[][] arr;
	static boolean[] visited;
	static int n;
	static int m;
	static int cnt=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		
		n=sc.nextInt();
		m=sc.nextInt();
		
		arr=new int[n+1][n+1];
		visited=new boolean[n+1];
		
		for(int i=0;i<m;i++) {
			int x=sc.nextInt();
			int y=sc.nextInt();
			
			arr[x][y]=arr[y][x]=1;
		}
		
		//bfs로 풀었을 떄 
		bfs(1);
		
		//dfs로 풀었을 떄 
		//dfs(1);
		//System.out.println(cnt-1);
	}
	
	
	static void dfs(int i) {
		if(visited[i])
			return;
		
		visited[i]=true;
		cnt++;
		
		for(int j=1;j<=n;j++) {
			if(arr[i][j]==1&&!visited[j])
				dfs(j);
		}
	}
	
	static void bfs(int i) {
		Queue<Integer>q=new LinkedList<>();
		
		visited[i]=true;
		q.offer(i);
		
		while(!q.isEmpty()) {
			int x=q.poll();
			
			for(int j=1;j<=n;j++) {
				if(arr[x][j]==1&&!visited[j]) {
					q.offer(j);
					visited[j]=true;
					cnt++;
				}
			}
		}
		
		System.out.println(cnt);
	}
}