※ 문제링크
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
※ 참고사이트
[그래프] 연결 요소
연결 요소에 대한 개념 정리와 백준 11724번: 연결 요소 문제 풀이
velog.io
해당 문제는 BFS로 해결할 수 있는 문제였다. 우선 연결 요소의 개념을 알아야 했기에 구글링을 통해 해당 개념을 확인하고, 문제를 해결하였다. 처음에 문제를 해결할때 간선이 없는 정점에 대해서는 고려하지 않아 오답을 받았다. 이후에는 해당 부분을 수정해주고, 생각한대로 구현했더니 문제를 해결할 수 있었다. 자세한 풀이방법과 코드는 아래와 같다.
1. 입력받은 값들을 딕셔너리를 활용하여 그래프를 구현한다.
2. 각 정점 방문여부를 확인할 체크리스트를 리스트로 구현하고, 간선이 없는 정점들을 그래프에 추가해준다.
3. 간선으로 연결된 정점들을 확인할 BFS함수를 작성한다.
4. 반복문을 통해 그래프내의 모든 정점들을 확인하고, 조건을 충족하면 cnt에 +1을 해준다.
5. 반복문을 모두 수행한 수 cnt값을 출력한다.
+ 시간 단축을 위해 입력값을 sys함수로 입력받았다.(사용시 개행문자에 유의하자)
import sys
from collections import deque
def bfs(number):
queue = deque(graph[number])
check[number] = True
while queue:
check_number = queue.popleft()
if check[check_number] == False:
check[check_number] = True
queue.extend(graph[check_number])
# input = sys.stdin.readline
N, M = map(int, input().split()) # N : 정점의 개수 / M : 간선의 개수
graph = dict()
for _ in range(M):
key, value = map(int, input().split())
if key != value:
if key not in graph:
graph[key] = [value]
else:
graph[key].append(value)
if value not in graph:
graph[value] = [key]
else:
graph[value].append(key)
check = [False for _ in range(N+1)]
cnt = 0
for i in range(1, N+1):
if i not in graph:
graph[i] = []
for num in graph:
if check[num] == False:
bfs(num)
cnt += 1
print(cnt)
P.S 개발자가 되기위해 공부중입니다. 잘못된 부분을 댓글로 남겨주시면 학습하는데 큰 도움이 될 거 같습니다.
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ] 18352번 특정 거리의 도시 찾기 / 사용언어 : 파이썬(python) (0) | 2022.01.14 |
---|---|
[BOJ] 14502번 연구소 / 사용언어 : 파이썬(python) (0) | 2022.01.14 |
[BOJ] 1707번 이분 그래프 / 사용언어 : 파이썬(python) (0) | 2022.01.12 |
[BOJ] 2206번 벽 부수고 이동하기 / 사용언어 : 파이썬(python) (0) | 2022.01.11 |
[BOJ] 7562번 나이트의 이동 / 사용언어 : 파이썬(python) (0) | 2022.01.10 |
댓글