내가 제일 취약해하는 DFS, BFS 문제이다..
항상 기피하던 알고리즘 중 하나인데 언제까지 피할 수만은 없으니, 기왕이면 며칠간 꾸준히 풀면서 간파해버리자👀‼️
우선 해당 문제는 DFS
알고리즘을 이용하였다.
1에서부터 이어지는 모든 컴퓨터들을 방문하여 확인해야한다.
나같이 dfs, bfs 문제에 약한 사람들은 접근 자체를 어떻게 해야할지 막막할 수 있다.
나는 아래와 같은 순서로 접근하였다.
- 특정 컴퓨터와 이어진 컴퓨터의 숫자값을 각 배열에 추가한다.
- 예를 들어, 1번이 2번과 이어져 있다면,
array_1
에 2라는 값을 추가해주고,array_2
에는 1을 추가해준다.- 컴퓨터 수+1만큼의 length를 가지는 배열(
visit
)을 선언해준다.
- 이는 바이러스가 방문했을 경우: 1, 안했다면: 0이 된다.
- 모든 인덱스의 default값: 0
dfs
를 통해visit
값을 set한다.
array_1
부터 시작했을 때,array_1
에 들어있는 값은 컴퓨터 1번과 이어져있다는 뜻. 즉, 배열1에 저장되어있는 값의 배열에 방문하여 또 다시visit
값을1
로 set.- ex.
array_1 = [3,4]
라면,visit
의 3번째, 4번째의 값을1
로 set하고,array_3
에 접근하여 해당 배열에 저장된 숫자 값도visit
값을 1로 set
n = int(input()) #컴퓨터 수
m = int(input()) #간선 (이어진 쌍의 수)
graph = [[] for _ in range(n+1)] #컴퓨터 수 +1 만큼의 배열
# 간선 수만큼 반복
for i in range(m):
x, y = map(int, input().split())
graph[x].append(y)
graph[y].append(x)
visit
)을 선언해준다.visit = [0] * (n+1)
dfs
를 통해 visit
값을 1로 set한다.def dfs(graph, v, visited):
visit[v] = 1
for i in graph[v]:
if visit[i] == 0:
dfs(graph, i, visited)
dfs(graph, 1, visit)
n = int(input())
m = int(input())
graph = [[] for _ in range(n+1)]
for i in range(m):
x, y = map(int, input().split())
graph[x].append(y)
graph[y].append(x)
visit = [0] * (n+1)
def dfs(graph, v, visited):
visit[v] = 1
for i in graph[v]:
if visit[i] == 0:
dfs(graph, i, visited)
dfs(graph, 1, visit)
print(visit.count(1) - 1)