Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
Tags
- 해시맵
- 다리놓기
- 플루이드-워셜
- D2
- LRU
- 에라토스테네스의체
- 회의실 배정
- BFS
- 우선순위 큐
- 최단경로
- firebase
- Flatten
- N-Queen
- 나는야 포켓몬 마스터 이다솜
- SWEA
- 배포
- 투포인터
- 이분탐색
- dfs
- 좌표 정렬하기
- 스도쿠 검증
- 다이나믹프로그래밍
- boj
- 그리디 알고리즘
- 백만 장자 프로젝트
- 브루트포스
- 터렛
- 완전탐색
- D3
- 간단한 369게임
Archives
- Today
- Total
허비의 기술블로그
[BOJ] 연결 요소의 개수(11724) - PYTHON 본문
그래프의 정점의 개수(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