https://www.acmicpc.net/problem/2606
❗dfs에 input으로 0번째 인덱스만 들어간다면,
예시가
1 2
2 3
3 4
5 4 인 경우,
4번 컴퓨터가 바이러스에 걸렸지만 5 4 행의 5번 컴퓨터도 바이러스에 걸린 것을 인식하지 못한다.
이를 해결하기 위해, reverse 된 list도 함께 ComList 변수에 넣어주고 탐색해준다.❗if y not in d: count += 1 ... 부분에서 ✅
d.append(y), dfs(y) 부분도 함께 들여쓰기가 되어야한다.
예시가
1 2
2 3
3 4
4 1 인 경우,
원형 순회가 되는데 dfs(y)가 if y not in d 조건 안에 없는 경우
1 -> 2 , 2 -> 3 , 3 -> 4 , 4 -> 1
dfs(1) 진행 중에 dfs(2) 이 진행되고 ... dfs(4) -> dfs(1)이 또다시 진행되기 때문에Recursion Error
발생. 고로 들여쓰기 필요! ( 이미 방문했다면 또다시 dfs가 돌지 않도록 )
import sys
C = int(sys.stdin.readline())
N = int(sys.stdin.readline())
ComList = [] # 컴퓨터 네트워크 쌍
d = [1] # 방문한 컴퓨터 번호
count = 0
def dfs(v):
global count
for x,y in ComList: # n으로 표기할거면, 2*n이 되어야함. reverse된 리스트까지 함께 돌려주는 거니까!!!!
if x == v:
if y not in d:
count += 1 # 바이러스 걸린 컴퓨터 카운트
d.append(y) # 2 삽입 (방문) ✅
dfs(y)
for i in range(N):
tmp = list(map(int, sys.stdin.readline().split()))
ComList.append(tmp)
ComList.append(list(reversed(tmp))) # 1 2 / 2 3 / 5 3 인 경우, 마지막에 3번도 바이러스인데 input에 [0]번 인덱스만 들어가면, 5번 컴퓨터 바이러스라고 인식 못함.
# 거꾸로 2 1 / 3 2 / 3 5 버전도 input으로 넣어줘야 전체적으로 찾아낼 수 있다.
dfs(1)
print(count)
✔️for문을 돌릴 때, reverse된 리스트를 포함시켜 돌리거나 list를 추가해서 돌릴 수도 있으니까 range(N) 보다 리스트에서 직접 원소를 꺼내 돌리쟈