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

어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하인 양의 정수이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.
출력
1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.
예제 입력 1 복사
7
6
1 2
2 3
1 5
5 2
5 6
4 7
예제 출력 1 복사
4
문제 이해
- 입력받은 정보를 그래프 형태로 처리하여 탐색을 수행하는 문제입니다.
- 그래프의 노드와 간선에 대한 정보를 받아와서 인접행렬 또는 인접리스트 형식으로 다뤄야 합니다.
- 그래프 정보를 바탕으로 DFS 또는 BFS를 수행해서 탐색합니다.
문제 풀이
- 그래프 정보를 바탕으로한 탐색 문제입니다.
- BFS를 사용해서 풀었고, 따라서 큐(덱)을 사용하였습니다.
- 그래프의 정보를 인접리스트 형태로 처리하였으며, 1에서부터 전파되는 횟수를 찾으므로 1에 대해서 BFS를 수행했습니다.
- BFS함수는 방문처리를 통해 중복을 피했고, 큐에서 노드 하나를 꺼내 탐색할때마다 카운트가 올라가게 했습니다.
- 1을 제외한 나머지 컴퓨터가 전염되는 것이므로, 노드1의 수를 하나 뺀 count -1을 정답으로 출력했습니다.
코드
#2606 바이러스
from collections import deque
def BFS(v,graph):
global count
q = deque()
q.append(v)
visited = [False]*len(graph)
visited[v]=True
while q:
v = q.popleft()
count += 1
for i in range(len(graph[v])):
if visited[graph[v][i]]==False:
q.append(graph[v][i])
visited[graph[v][i]] = True
n = int(input())
m = int(input())
graph = [[] for _ in range(n+1)]
count = 0
for _ in range(m):
a,b = map(int,input().split())
graph[a].append(b)
graph[b].append(a)
BFS(1,graph)
print(count-1)
'알고리즘 풀이 > Python' 카테고리의 다른 글
[Python] 직사각형에서 탈출 (백준 1085번 파이썬) (0) | 2023.08.27 |
---|---|
[Python] DFS와 BFS (백준 1260번 파이썬) (0) | 2023.08.27 |
[Python] 미로 탐색 (백준 2178번 파이썬) (1) | 2023.08.26 |
[Python] 게임 맵 최단거리 (프로그래머스 Lv2 파이썬) (0) | 2023.08.26 |
[Python] 설탕 배달 (백준 2839 파이썬) (0) | 2023.08.26 |