https://www.acmicpc.net/problem/2606
2606번: 바이러스
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어
www.acmicpc.net
import sys
from collections import defaultdict
input = sys.stdin.readline
def dfs(v = 1,visited = []):
if v in visited: # 1번째 탈출조건 : 만약 방문한적이 있다면 탈출
return
visited.append(v) # 방문한 곳 추가
for i in graph_dict[v]: # 있는 곳에서 방문 할 수 있는곳 돌기 2번째 탈출 조건: 방문 할 수 있는 곳이 없으면 탈출
dfs(i,visited) # 방문 가능한 곳 재귀로 돌기
return len(visited) - 1 # 바이러스 걸린 컴퓨터의 개수 반환(1번 컴퓨터 제외)
n = int(input().strip()) # 컴퓨터의 개수
m = int(input().strip()) # 간선의 개수
graph = [list(map(int,input().split())) for _ in range(m)] # 리스트로 받기
graph_dict = defaultdict(list) # 받은걸 dict 형태로 저장 (양방향이기 때문에 2번씩 추기해줌)
for i in graph:
graph_dict[i[0]].append(i[1])
graph_dict[i[1]].append(i[0])
#print(graph_dict)
#defaultdict(<class 'list'>, {1: [2, 5], 2: [1, 3, 5], 3: [2], 5: [1, 2, 6], 6: [5], 4: [7], 7: [4]})
print(dfs())
dfs를 사용해서 갈 수 있는 곳을 돌면서 간 곳의 개수를 구해주는 프로그램을 만들었다.
간선의 방향이 양방향이기 때문에 graph_dict에 양방향으로 dict에 추가 했다.
collections의 defaultdict를 사용해서 dict의 key 가 초기화가 안되어 있을 때 list로 초기화 하게 만들었다.
'백준 문제 풀이 및 피드백' 카테고리의 다른 글
2023.01.15 미로탐색 백준 (0) | 2023.01.15 |
---|---|
2023.01.15 영역구하기 백준 (0) | 2023.01.15 |
2023.01.15 단지번호붙이기 백준 (0) | 2023.01.15 |
2023.01.14 백준 쿼드트리 (0) | 2023.01.14 |
2022.12.28 백준 랜선 자르기 (0) | 2022.12.28 |