[백준] 2606번 바이러스
2020년 07월 19일, 18:45
바이러스
문제 설명
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다. 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.
어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.
출력
1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.
문제 풀이
- edges 배열을 만들어준다.
- excuteBFS
- queue와 visited배열을 만들어 준다.(queue에는 시작 컴퓨터 1번을 넣어줌, visited 배열은 컴퓨터 순서를 맞추기 위해 +1)
- edges배열에서 양방향으로 startComputer와 연결된 computer을 찾고, queue에 넣어준다.(visited도 바꿔줌.)
- queue가 길이가 0일 때, 멈추고 visited배열을 리턴.(1번부터 시작해서 queue가 0이 되는 경우는 1번에 연결된 컴퓨터를 모두 방문했을때.)
- 1번에 연결된 컴퓨터들의 숫자를 세줌(visited배열에서 true값들을 세줌.).
- 1번 컴퓨터 제외를 위해 -1
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
// const input = fs.readFileSync("./stdin").toString().trim().split("\n");
const computers = Number(input[0]);
const edgesLength = Number(input[1]);
const getEdges = edgesInputs => {
const edgesArr = [];
edgesInputs.forEach(edgeInput => {
const edge = edgeInput
.trim()
.split(" ")
.map(element => Number(element));
edgesArr.push(edge);
});
return edgesArr;
};
const edges = getEdges(input.slice(2, input.length));
const excuteBFS = (edges, edgesLength) => {
const queue = [1];
const visited = Array(computers + 1).fill(false);
while (queue.length) {
const startComputer = queue.shift();
for (let index = 0; index < edgesLength; index++) {
const [computer1, computer2] = edges[index];
if (computer1 === startComputer && !visited[computer2]) {
queue.push(computer2);
visited[computer2] = true;
}
if (computer2 === startComputer && !visited[computer1]) {
queue.push(computer1);
visited[computer1] = true;
}
}
}
return visited;
};
const result = excuteBFS(edges, edgesLength);
let computerCount = 0;
result.forEach(element => {
if (element) computerCount++;
});
console.log(computerCount - 1);