문제 바로가기
2606번: 바이러스
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어
www.acmicpc.net
문제풀이
바이러스에 감염된 컴퓨터를 확인하기 위해 컴퓨터끼리의 연결상태를 확인해야한다.
컴퓨터끼리의 연결상태를 인접행렬로 표시한다.(연결되어있으면 1로 표기 )
감염된 컴퓨터를 큐에 넣고, 큐가 빌때까지 반복하면서 해당 컴퓨터와 연결된 컴퓨터를 감염시킨다.(BFS)
변수
- computer : 컴퓨터의 감염여부를 담는 boolean 배열
- map : 컴퓨터끼리 연결상태를 나타나는 2차원 인접행렬
- q : 바이러스에 감염된 컴퓨터를 확인하기 위해 BFS에서 사용하는 큐
로직 구현
- findVirus(1)을 통해 1번 컴퓨터와 연결된 컴퓨터는 감염 표기하고 큐에 넣기
- 큐가 빌때까지 큐에 들어있는 컴퓨터를 확인하면서 감염되었으면 감염표기하고 q에 넣기를 반복
- 감염된 컴퓨터를 카운팅하여 출력
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int C, N, res, map[][];
static boolean computer[];
static StringTokenizer st;
static Queue<Integer> q;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
C = Integer.parseInt(br.readLine());
N = Integer.parseInt(br.readLine());
res = 0;
q = new LinkedList<Integer>();
computer = new boolean[C + 1];
map = new int[C+1][C+1];
for (int n = 0; n < N; n++) {
st = new StringTokenizer(br.readLine(), " ");
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
map[start][end] = 1;
map[end][start] = 1;
}
findVirus(1);
for (int c = 2; c <= C; c++) {
if (computer[c])
res++;
}
System.out.println(res);
}
private static void findVirus(int idx) {
q.offer(idx);
computer[idx] = true;
while (!q.isEmpty()) {
int cur = q.poll();
for(int i=1; i<=C;i++)
if (!computer[i] && map[cur][i]==1) {
computer[i] = true;
q.offer(i);
}
}
}
}
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 경쟁적 전염 for Java - PriorityQueue를 적용한 풀이 (2) | 2022.03.02 |
---|---|
[BOJ] 7785번 회사에 있는 사람 for JAVA (0) | 2022.01.17 |
[백준] 11047번 동전 0 for JAVA - 탐욕 알고리즘 적용한 풀이 (0) | 2022.01.11 |
[백준] 1806번 부분합 for JAVA - 인덱스 이동 (0) | 2022.01.10 |
[백준] 1764번 듣보잡 for JAVA - HashSet 이용 (0) | 2022.01.07 |