허비의 기술블로그

[BOJ] 연결 요소의 개수(11724) - PYTHON 본문

BOJ

[BOJ] 연결 요소의 개수(11724) - PYTHON

허비1411 2022. 6. 5. 20:48

그래프의 정점의 개수(N), 간선의 개수(M), 연결된 간선의 정보가 입력으로 주어진다. 이때 주어진 그래프에서 Connected Component(연결된 요소의 개수)를 구하는 문제다. 

출처: 위키피디아

다음과 같은 그래프가 주어진다면 Connected Component의 개수는 3개이다.

시간 복잡도: O(MN)

 

11724번: 연결 요소의 개수

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주

www.acmicpc.net


풀이 과정

BFS나 DFS와 같은 그래프 탐색 방법을 활용하면 연결된 모든 노드(정점)를 방문할 수 있다. 따라서 시작점을 1~N으로 하는 총 N번의 탐색과정을 통해 연결된 요소의 개수를 구할 수 있다. 이때 시작점의 방문 여부를 비교하며 아직 방문하지 않았을 때만 정답 값에 1을 더한다.

ex)
N = 3, M = 1
간선 정보 : 1 - 2
이렇게 입력이 들어오면 1번 정점을 시작점으로 하고  BFS/DFS로 연결된 정점을 방문했을 때 1,2번 정점을 방문하게 된다. 따라서 시작점을 2로 하고 반복할 때는 이미 방문한 정점이므로 정답 값에 1을 더하지 않고 (연결된 요소의 개수로 치지 않고) 다음 정점으로 넘어간다. 


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import sys
from collections import deque
input = sys.stdin.readline
 
N, M = map(int, (input().split()))
varr = [[] for _ in range(N)]
for _ in range(M):
    a, b = map(int, input().split())
    varr[a - 1].append(b - 1)
    varr[b - 1].append(a - 1)
visit = [False* N
answer = 0
for i in range(N):
    if visit[i]:
        continue
    answer += 1
    q = deque()
    q.append(i)
    visit[i] = True
    while len(q) > 0:
        cur = q.popleft()
        for temp in varr[cur]:
            if not visit[temp]:
                q.append(temp)
                visit[temp] = True
print(answer)
cs

주석 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import sys
from collections import deque
 
input = sys.stdin.readline  # 입력 효율화
 
N, M = map(int, (input().split()))  # 정점의 개수, 간선의 개수
varr = [[] for _ in range(N)]  # 정점마다 연결 간선의 정보를 담을 2차원 배열(index:정점 value:연결된 정점배열)
for _ in range(M):
    a, b = map(int, input().split())  # 연결된 두 정점 입력 
    varr[a - 1].append(b - 1)  # 정점 정보 입력 (a점에 b점 연결), 배열은 index가 0부터 시작하므로 (값 - 1)로 접근 + 저장
    varr[b - 1].append(a - 1)  # 정점 정보 입력 (b점에 a점 연결)
visit = [False* N  # 방문여부 확인할 배열
answer = 0  # 연결된 요소의 개수
for i in range(N):
    if visit[i]:  # 이미 방문했다면
        continue  # 다음 정점으로
    answer += 1  # 연결된 요소의 개수 + 1
    ###BFS###
    q = deque()  # BFS를 위한 Queue
    q.append(i)  # Queue의 첫 요소로 현재 정점
    visit[i] = True  # 현재 정점 방문으로 체크
    while len(q) > 0:  # Queue가 비어있지 않다면
        cur = q.popleft()  # Queue에서 정점을 꺼내서
        for temp in varr[cur]:  # 연결된 정점을 확인
            if not visit[temp]:  # 아직 방문하지 않았다면
                q.append(temp)  # Queue에 추가
                visit[temp] = True  # 방문으로 체크
print(answer)  # 전체 연결된 요소 개수 출력
cs

채점 결과

 

'BOJ' 카테고리의 다른 글

[BOJ] 암호 만들기(1759) - PYTHON  (0) 2022.06.08
[BOJ] 연구소(14502) - PYTHON  (0) 2022.06.06
[BOJ] 이친수(2193) - PYTHON  (0) 2022.06.04
[BOJ] 2xn 타일링 2(11727) - PYTHON  (0) 2022.06.03
[BOJ] 가운데를 말해요(1655) - PYTHON  (0) 2022.06.01
Comments