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

어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하인 양의 정수이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.
출력
1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.
설명
전형적인 dfs,bfs문제
본인은 dfs와 인접행렬로 풀었다
NxN짜리 행렬을 만들어주고 각 케이스에 대해 경로가 있으면 1로 채워줬다
지나간 곳은 다시 가면 안되기에 N짜리 리스트를 만들어서 지나갈때 True로 채워서 이미 지나간 곳을 지나가지 않게 했다
1번 컴퓨터가 훝고가는 컴퓨터만 계산하면 되기 때문에 dfs함수를 만들어서 1번 컴퓨터의 경우만 돌려줬다
최종적으로 지나간 컴퓨터의 갯수를 세고 1번 컴퓨터를 제외해야하기에 1을 빼서 출력해주면 된다
코드
import sys
N = int(sys.stdin.readline())
M = int(sys.stdin.readline())
adj = [[0] * N for _ in range(N)]
chk = [False] * N
for i in range(M):
a, b = map(lambda x: x - 1, map(int, sys.stdin.readline().split()))
adj[a][b] = adj[b][a] = 1
def dfs(now):
for nxt in range(N):
if adj[now][nxt] and not chk[nxt]:
chk[nxt] = True
dfs(nxt)
chk[0] = True
dfs(0)
print(chk.count(True) - 1)
dfs를 배우고 처음 풀어보는 문제인데 dfs bfs류는 어려워보인다 연습이 필요하겠다...
'PS' 카테고리의 다른 글
[백준 파이썬(python) 2667번 문제] (단지번호붙이기) (0) | 2023.08.24 |
---|---|
[백준 파이썬(python) 1260번 문제] (DFS와 BFS) (0) | 2023.08.24 |
[백준 파이썬(python) 2217번 문제] ( 로프 ) (0) | 2023.08.21 |
[백준 파이썬(python) 1449번 문제] (수리공 항승) (0) | 2023.08.21 |
[백준 파이썬(python) 11047번 문제] (동전 0) (0) | 2023.08.21 |