N
: 정점의 개수 ()
M
: 간선의 개수 ()
u
, v
: 간선의 양 끝점 ()
✅ 입력 조건
1.N
,M
공백 구분해 입력
2.M
번 반복해u
,v
간선 정보 입력
3. 같은 간선은 1번만 입력됨
4. 방향 없는 그래프
✅ 출력 조건
1. 연결 요소의 개수 출력
연결 요소(Connected Component)의 개수는 연결된 묶음들이 몇 개인지를 의미한다.
이전 순열 사이클 문제처럼 BFS를 통해 연결된 모든 노드를 탐색하고, BFS를 수행한 횟수만큼 출력하면 된다.
방향 없는 그래프이기 때문에 입력 받은 연결 정보를 그래프에 넣을 때, 두 정점 모두에 서로를 연결 노드로 입력한다.
큐를 통해 BFS를 구현하고, 큐에 각 노드를 넣어 연결된 모든 노드를 탐색한다.
방문 리스트를 돌면서 방문 안한 노드가 있다면 BFS를 수행해서 그 수행 횟수를 계산하고 출력한다.
그래프 저장 →
BFS 수행 →
전체 그래프 돌기 →
최종 시간복잡도
으로,
최악의 경우, N이 최대 1000일 때도 1초 내로 계산이 가능할 것 같다.
그래프에 연결 정보를 저장하고 BFS 수행 횟수 계산하기
### 수정 전
# BFS 수행
for i in range(N+1):
if not visited[i]:
bfs(i)
count += 1
### 수정 후
# BFS 수행
for i in range(1, N+1):
if not visited[i]:
bfs(i)
count += 1
import sys
from collections import deque
input = sys.stdin.readline
# BFS 정의
def bfs(x):
queue = deque([x])
# 방문 처리
visited[x] = 1
# 큐가 빌 때까지 반복
while queue:
y = queue.popleft()
for i in graph[y]:
if not visited[i]:
# 방문 처리
visited[i] = 1
queue.append(i)
# N, M 입력
N, M = map(int, input().split())
# 그래프 정의
graph = [[] for _ in range(N+1)]
# M번 반복해 u, v 입력받아 그래프에 저장
for _ in range(M):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
# 방문 리스트 정의
visited = [0] * (N+1)
# 연결 요소 세는 변수 정의
count = 0
# BFS 수행
for i in range(1, N+1):
if not visited[i]:
bfs(i)
count += 1
# 정답 출력
print(count)