백준 :: 바이러스 <2606번>

혜 콩·2022년 6월 14일
0

알고리즘

목록 보기
23/61

> 문제 <

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) 보다 리스트에서 직접 원소를 꺼내 돌리쟈

profile
배우고 싶은게 많은 개발자📚

0개의 댓글