기억할 것
1. DFS(깊이 우선 탐색)
2. BFS(넓이 우선 탐색)
3. DFS는 재귀함수에서 기저 상태를 정의하지 않음(정의할 수도 있겠으나 대부분의 사람들은 사용하지 않는 듯 ..? 사실 추가적인 학습이 필요할 것 같다.
한달 전에 못 푼 문제 그래프 탐색 배우고 푸니까 기쁘다 ㅎㅎ
문제
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.
예를 들어 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
내 풀이 - DFS로 풂
import sys
#재귀함수 stack 쌓이는거 제한 풀기
sys.setrecursionlimit(10**7)
cpuNum = int(input())
lines = int(input())
box = [[] for i in range(cpuNum)]
#인접한 점 표시
for i in range(lines):
x, y = map(int,input().split())
box[x-1].append(y)
box[y-1].append(x)
#방문한 점에 대해 True 로 표시
check = [False for i in range(cpuNum)]
check[0] = True
def f(x):
#방문한 점에 대해서는 True 로 방문 표시
check[x-1] = True
#방문한 점과 연결된 점들이
for i in box[x-1]:
#방문하지 않았다면
if check[i-1] == False:
#탐색하라.
f(i)
f(1)
print(check.count(True)-1)