파이썬 알고리즘 문제 풀이

Baekjoon Online Judge 11724번 파이썬

gogi masidda 2022. 8. 1. 14:55

문제 링크
https://www.acmicpc.net/problem/11724

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


dfs를 이용하여 1이 들어있는 연결된 요소 하나를 찾고
for문과 if를 활용해서 만약 연결되지 않은 노드가 있다면 그 요소들끼리 또 묶어주었다.
그리고 그 연결된 요소가 몇개인지 알기 위해 result 리스트를 사용하였다.

자꾸 recursion error가 났었는데 이는 파이썬에서 설정한 재귀 깊이를 넘어서 그런 것이었다.
sys.setrecursionlimit(10 ** 6)
이 코드를 사용하여 재귀 깊이를 더 늘려주었다.

정답 코드

import sys
sys.setrecursionlimit(10 ** 6)
N, M = map(int,sys.stdin.readline().split())

nodes = []

for i in range(M):
  nodes.append(list(map(int,sys.stdin.readline().split())))

graph = [[] for _ in range(N+1)]
for node in nodes :
  graph[node[0]].append(node[1])
  graph[node[1]].append(node[0])

graph = list(map(sorted, graph)) #그래프 정렬

visited = [False] * (N+1)
def dfs(V):
  visited[V] = True
  
  for i in graph[V]:
    if not visited[i]:
      dfs(i)

result = []
result.append(dfs(1))
  
for i in range(1,N+1):
  if not visited[i]:
    result.append(dfs(i))

print(len(result))
728x90