백준 2606번 바이러스 - Python
문제 링크 : https://www.acmicpc.net/problem/2606
이번 문제는 BFS를 사용하여 풀면 된다.
BFS
- 너비 우선 탐색(Breadth-First Search)으로 깊게 탐색하기 전에 양 옆으로 넓게 탐색한다. 그래서 시작 정점에서 인접한 노드들을 먼저 탐색 후 멀리 떨어져 있는 노드들을 탐색한다.
- 큐(Queue)를 사용하여 선입선출법(FIFO) 방식으로 탐색한다.
풀이
- 1번 컴퓨터가 바이러스에 걸렸을 때, 1번을 통해 감염된 컴퓨터의 수를 출력하면 된다.
- 입력값은 컴퓨터 수 N, 직접 연결되어있는 간선 수 M과
이어진 노드의 쌍을 입력한다. - 이어진 노드들은 딕셔너리 형태로 값을 받아주었다.
- 감염된 컴퓨터 수를 출력해야하므로 1번 컴퓨터(숙주)는 제외시킨다.
- 큐의 성질이 담긴 BFS 함수를 만들어주었다.
- visited[] 라는 빈 리스트를 만들어 방문하지 않은 노드는 추가해준다.(감염된 컴퓨터의 수를 체크하기 위해 / 마지막엔 감염된 노드들만 들어있게 된다.)
해답
from sys import stdin
read = stdin.readline
dic={} # {1:{a,b}}
for i in range(int(read())): # 7
dic[i+1] = set() # 인덱스는 0부터 시작이니까 +1 해줌
for j in range(int(read())): # 6
a, b = map(int,read().split()) # [1,2][2,3][1,5][5,2][5,6][4,7]
dic[a].add(b) #양방향 성질
dic[b].add(a)
def bfs(start):
queue = [start]
while queue:
for i in dic[queue.pop(0)]: # 큐(선입선출법) 첫번째꺼 지워주고 마지막에 넣어준다
if i not in visited: # visited에 값이 없으면
visited.append(i)
queue.append(i)
visited = [] #[2,5,1,3,6]
bfs(1) # = start = 1
print(len(visited)-1) # 1은 숫주 그 자체이므로 감염된 컴퓨터 수를 구하기 위해 -1
Author And Source
이 문제에 관하여(백준 2606번 바이러스 - Python), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@pmk4236/백준-2606번-바이러스-Python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)