☑️ [Python, 백준/2606번] 바이러스
1️⃣ 문제
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.
예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.
어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.
2️⃣ 접근
정석적인 그래프 탐색 문제다. DFS와 BFS 둘 중 아무거나 풀어도 풀 수 있는 문제지만 BFS로 해결했다. DFS와 BFS 개념을 배울 때 'Introduction to Algorithms' 책으로 배웠었는데 DFS는 모든 노드에서 순회한다. BFS는 한 시작 노드가 존재한다는 개념이 있었다.
해당 문제도 단순히 1번 컴퓨터부터 탐색하면 되기 때문에 BFS를 선택했었는데 DFS나 BFS나 상관없을 것 같다. 알고리즘이라는 게 강력한 틀이 있는 게 아니라 핵심 Core만 지키면 되는 것 같아서.. BFS에다가 모든 노드를 순회하는데 Queue를 쓰면 그게 BFS지 달리 무엇이 있을까.
어쨌든 BFS가 탐색에 성공하면 수를 증가시키는 방향으로 문제를 해결할 수 있었다.
3️⃣ 코드
from collections import deque
computer_count = int(input())
connect_count = int(input())
graph = [[0]*(computer_count+1) for _ in range(computer_count+1)]
for i in range (connect_count):
a,b = map(int,input().split())
graph[a][b] = graph[b][a] = 1
visit = [False] * (computer_count + 1)
sum = 0
def bfs(node) -> int:
global sum
q = deque([node])
visit[node] = True
while len(q) > 0:
s = q.popleft()
for i in range(1, computer_count + 1):
if graph[s][i] == 1 and not visit[i]:
visit[i] = True
sum = sum + 1
q.append(i)
visit[s] = True
return sum
print(bfs(1))
'코테 > 백준' 카테고리의 다른 글
[Python, 백준/21606번] 아침 산책 (0) | 2024.10.07 |
---|---|
[Python, 백준/11725번] 트리의 부모 찾기 (1) | 2024.09.24 |
[Python, 백준/11724번] 연결 요소의 개수 (0) | 2024.09.24 |
[Python, 백준/1260번] DFS와 BFS (0) | 2024.09.21 |
[Python, 백준/1991번] 트리 순회 (2) | 2024.09.19 |