관리 메뉴

공부 기록장 💻

[알고리즘/BFS,DFS] 백준 BOJ 2606 바이러스 본문

# CS Study/Algorithms

[알고리즘/BFS,DFS] 백준 BOJ 2606 바이러스

dream_for 2022. 8. 23. 09:33

6. BOJ 2606 바이러스

문제

신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.

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

어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.

출력

1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.

예제 입력 1

7
6
1 2
2 3
1 5
5 2
5 6
4 7

예제 출력 1

4

 

 


 

💡나의 문제 풀이

문제 해결 아이디어

  • 그래프 생성 후, False 리스트를 만들고 1번을 통해 인접한 노드들을 탐색할 때마다 해당 노드의 리스트 값을 True로 변경
  • True의 개수 출력

 

고려 사항

  • 1을 통해 연결된 네트워크 상의 모든 컴퓨터를 출력해야 하므로, 1번은 제외하고 출력한다.

 


작성 코드

def dfs(graph, v, visited):
  # 현재 노드 방문 처리
  visited[v] = True
  for i in graph[v]:
    if visited[i]==False:
      dfs(graph, i, visited)

      
n = int(input()) # 컴퓨터 수
m = int(input()) # 간선 개수

graph = [[] for _ in range(n+1)]

for i in range(m):
  a, b = map(int, input().split())
  graph[a].append(b)
  graph[b].append(a)

# 1번부터 인접한 노드들을 탐색하며 
visited = [False]*(n+1)

dfs(graph, 1, visited)
cnt = 0
for i in visited:
  if i==True: # 1과 연결된 네트워크상의 모든 노드들
    cnt += 1

print(cnt-1) # 1 제외

 


답안 코드

  1. 마지막 출력을 sum 함수를 이용할 수도 있다.
  2. print(sum(visited)-1)
  3. visited[] 리스트를 사용하지 않고 global 변수를 사용해서 cnt 값을 증가시키는 방법도 있다.
  4. cnt = 0 visited = [0]*(n+1) def dfs(start): global cnt visited[start] = 1 for i in graph[start]: if visited[i]==0: dfs(i) cnt +=1 dfs(1) print(cnt)

 

 

리뷰

  • 기본적인 dfs만 이해하면 쉽게 풀수 있었던 문제이다 🙂
728x90
반응형
Comments