[백준 / Python] 바이러스

yejichoi·2023년 10월 27일
0

알고리즘 스터디

목록 보기
138/153

바이러스

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


나의 풀이

bfs로 접근했으나 반례에서 막혔다

import sys
from collections import deque
input = sys.stdin.readline

n= int(input())
m = int(input())
arr = [list(map(int, input().split())) for _ in range(m)]
visited = [0] * (n+1)
#arr.sort(key= lambda x : x[0])
visited[1] = 1
arr = deque(arr)
q = deque([arr.popleft()])

while q:
    start, end = q.popleft()
    #print(start, end)
    if visited[start] == 1 and visited[end] == 0:
        visited[end] = 1

    if arr:
        e = arr.popleft()
        q.append(e)

print(visited.count(1)-1 )

리팩토링

dfs 접근

n = int(input())
m = int(input())

graph = [[] for _ in range(n+1)]
print(graph)
for i in range(m):
    x, y = map(int, input().split())

    graph[x].append(y) # 양방향
    graph[y].append(x) # 양방향 
print(graph)

visited = [0] * (n+1)

def dfs(graph, v, visited):
    visited[v] = 1
    for i in graph[v]:
        if visited[i] == 0:
            dfs(graph, i, visited)

dfs(graph, 1, visited)
print(visited.count(1) - 1)

0개의 댓글