신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.
예를 들어 7
대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1
번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2
번과 5
번 컴퓨터를 거쳐 3
번과 6
번 컴퓨터까지 전파되어 2
, 3
, 5
, 6
네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4
번과 7
번 컴퓨터는 1
번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.
어느 날 1
번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1
번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.
100
이하인 양의 정수이고 각 컴퓨터에는 1
번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.1
번 컴퓨터가 웜 바이러스에 걸렸을 때, 1
번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.N = int(input()) # 컴퓨터의 수
M = int(input()) # 연결된 컴퓨터 쌍의 수
adj = [[] for _ in range(N)] # 인접리스트 선언
for _ in range(M):
a, b = map(int, input().split())
adj[a - 1].append(b - 1) # 0 부터 N-1 까지로 사용하려면 -1 해줌
adj[b - 1].append(a - 1)
visit = [False] * N # visit 배열 초기화
# DFS
def dfs(u):
visit[u] = True # 방문한 노드 True로 업데이트
for v in adj[u]: # 인접노드 검사
if not visit[v]:
dfs(v) # 방문 안한 노드 재귀 호출
dfs(0) # 1부터 수행해서 도달할 수 있는 노드 검사
count = 0
for i in range(1, N): # 0번 제외한 1번부터 N-1번 컴퓨터 중
if visit[i]: # 방문했다면 (True)
count += 1 # count + 1
print(count) # count값 출력
DFS
알고리즘 재귀호출
을 이용한 풀이다.adj
에 담아 주고 , 방을 체크할 visit
배열을 초기화 한다.DFS
함수에서 방문한 노드를 True
로 업데이트 해준다.DFS
함수를 실행해준다.dfs(0)
을 호출하여 함수를 시작해준다.count
변수를 초기화 하고, 0
번을 제외한 N-1번
컴퓨터 중 방문한 노드만 count
에 개수를 세주고 count
를 출력하면 된다.import sys
from collections import deque
N = int(sys.stdin.readline())
M = int(sys.stdin.readline())
net = [[] for _ in range(N+1)]
for _ in range(M):
a, b = map(int, sys.stdin.readline().split())
net[a].append(b)
net[b].append(a)
def bfs():
q = deque()
count = 0 # 감염된 컴퓨터 수
q.append(1) # 1번 컴퓨터로부터 시작
visited[1] = True # 1번 컴퓨터 감염완료
while q:
cur = q.popleft()
for i, val in enumerate(net[cur]): # 감염된 컴퓨터로부터 연결된 컴퓨터들에서
if visited[val]==False: # 감염되지 않았다면
q.append(val) # 감염리스트에 추가
visited[val] = True # 감염완료
count += 1 # 감염된 컴퓨터 수 1 증가
print(count) # 모두 감염되었을 때 출력
visited = [False for _ in range(N+1)]
bfs()
BFS
를 이용한 풀이이다.
- 이 문제는
DFS
,BFS
,그래프
등 다양한 방법으로 풀 수 있는데 개인적으로는DFS
를 이용한 풀이가 가장 깔끔한 것 같다.