[백준] 2606. 바이러스
2022. 4. 15. 23:38ㆍ알고리즘(Python)/백준
1번 컴퓨터를 통해 바이러스에 걸리는 컴퓨터의 수를 구하는 문제로 다시 해석하면 1번과 직, 간접적으로 연결된 컴퓨터를 탐색해 그 수를 출력하는 문제다. bfs, dfs 중 아무거나 사용해도 되겠지만 이번에는 bfs를 사용했다.
from collections import deque
from sys import stdin
def bfs(start_node):
global count
q = deque()
q.append(start_node)
visited[start_node] = True
while q:
v = q.popleft()
for n in graph[v]:
if not visited[n]:
q.append(n)
visited[n] = True
count += 1
num_of_com = int(stdin.readline())
num_of_node = int(stdin.readline())
graph = [[] for _ in range(num_of_com+1)] #노드 번호와 인덱스를 맞추기 위해 사용하지 않는 노드 1개 추가
visited = [False] * (num_of_com+1)
count = 0
for i in range(num_of_node):
info = list(map(int, stdin.readline().split()))
graph[info[0]].append(info[1])
graph[info[1]].append(info[0])
bfs(1)
print(count)
32460 kb | 88 ms |
크게 아래의 조건만 떠올릴 수 있다면 문제를 풀 수 있다.
1. 주어진 정보로 그래프를 만든다.
2. 방문을 했는지 확인할 bool 배열(리스트)를 만든다.
3. BFS를 통해 탐색하면서 새로운 노드를 방문 할 때마다 count + 1 해준다.
4. 마지막에 count를 print( ) 해준다.
아래 두 코드는 공부를 하기 위해 가져온 상위 답안자의 답이다.
import sys
def dfs(n):
Heap.append(n)
for v in V[n]:
if v not in Heap:
dfs(v)
N = int(sys.stdin.readline())
M = int(sys.stdin.readline())
V = [[] for _ in range(N + 1)]
Heap = []
for i in range(M):
a, b = map(int, sys.stdin.readline().split())
V[a].append(b)
V[b].append(a)
dfs(1)
print(len(Heap) - 1)
29200 kb | 64 ms |
import sys
_=input();T={};V=[0]*101
def D(k):
while T[k]:
t=T[k].pop()
if not V[t]:V[t]=1;D(t)
A={(*map(int,sys.stdin.readline().split()),) for i in range(int(input()))}
for a in A:
for i in [0,1]:T.setdefault(a[i],[]).append(a[1-i])
try:
while T[1]:D(T[1].pop())
except:pass
print(sum(V[2:]))
29200 kb | 64 ms |
'알고리즘(Python) > 백준' 카테고리의 다른 글
[3986] 좋은단어 (C#) (0) | 2022.09.13 |
---|---|
[백준] 1931. 회의실 배정 (0) | 2022.04.22 |
[백준] 3036. 링 (0) | 2022.04.18 |
[백준] 2010. 플러그 (0) | 2022.04.10 |
[백준] 1260. DFS와 BFS (0) | 2022.04.07 |