[Silver III] 바이러스 - 2606
성능 요약
메모리: 108384 KB, 시간: 88 ms
분류
그래프 이론, 그래프 탐색, 너비 우선 탐색, 깊이 우선 탐색
제출 일자
2025년 1월 21일 14:03:48
문제 설명
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.
예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.
어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하인 양의 정수이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.
출력
1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.
DFS 풀이과정
DFS를 처음 제대로 생각하면서 사용해봤는데 신기했다.
- 인접 리스트로 만든다. -> [[], [2, 5], [1, 3, 5], [2], [7], [1, 2, 6], [5], [4]]
- visited 배열을 만든다.
- dfs를 사용해서 완전 탐색을 한다. 여기서는 방문 횟수만 보기 때문에 ans를 전역변수로 선언하고 1만 더해줬다. 또한 현재 노드를 방문처리한다.
- dfs(1)을 호출했을 때 adj[1]의 안의 노드들 중 방문되지 않은 노드를 dfs로 방문한다. 차례차례 완전 탐색
DFS를 막연하게 어렵게만 생각했다. 수업시간에 배운 내용을 코드로 어떻게 바꾸지? 라고 생각했었는데 막상 종이에 적으면서 고민하고 그려보고 수도코드처럼 적으면서 하니까 의외로 금방 만들어진다. DFS, BFS의 포인트는 인접 리스트를 만드는 것이라는 걸 알게되었다. 뿌듯.
나의 코드
def dfs(c):
global ans
ans += 1
v[c] = 1
for n in adj[c]:
if not v[n]:
dfs(n)
N = int(input())
M = int(input())
adj = [[] for _ in range(N+1)]
for _ in range(M):
A, B = map(int, input().split())
adj[A].append(B)
adj[B].append(A)
ans = 0
v = [0] * (N+1)
dfs(1)
print(ans-1)
'알고리즘 > 백준' 카테고리의 다른 글
[Silver IV] 체스판 다시 칠하기 - 1018 python (0) | 2025.01.23 |
---|---|
[Silver III] 1, 2, 3 더하기 - 9095 python (0) | 2025.01.22 |
[Silver III] 1로 만들기 - 1463 python (0) | 2025.01.20 |
[Silver III] 피보나치 함수 - 1003 python (0) | 2025.01.16 |
[Bronze I] 최대공약수와 최소공배수 - 2609 python (1) | 2025.01.16 |