Home BOJ 11742번 연결 요소의 개수 파이썬
Post
Cancel

BOJ 11742번 연결 요소의 개수 파이썬

문제

방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 연결 요소의 개수를 출력한다.

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
31
32
#11742 연결 요소의 개수
import sys

sys.setrecursionlimit(10000)  # 재귀 제한을 확대해야 함.

def dfs(x):
    if not visited[x]:
        visited[x] = True
        for i in graph[x]:
                dfs(i)
        return True
    return False #방문했었으면 return False

#True가 될 때마다 1을 더한다
n,m = map(int,input().split()) # [[],[2,3],[1,4]]

visited = [False] * (n + 1)

graph = [[] for _ in range(n+1)] #0 포함해서 생성

for i in range(m):
    a,b = map(int,sys.stdin.readline().split()) # 1,2
    graph[a].append(b)
    graph[b].append(a)

sum = 0

for i in range(1, n+1):
        if dfs(i) == True:
            sum+=1
print(sum)

틀렸던 이유:

  1. Recursion Error가 나서 sys.setrecursionlimit(10000)를 해주어야 함
  • 이건 범위가 어떻게 주어졌을때 발생하는지 몰라서 시간 날때 제대로 공부해봐야겠다.
  1. 상하좌우로 가는 문제의 경우 dfs 인자의 범위를 정해주었는데, 여기선 그럴 필요 없는데 범위를 줬었다, 그것도 틀리게

느낀 점:

  • dfs 반환값이 True일때만 +1을 하는 문제의 경우, if (방문 처리 안되었을 경우)에 재귀, 그리고 return true하고 else(아닐 시)에는 return False를 해주어야 +1이 안된다.
  • 1부터 시작하는 경우, 0은 생성하지만 무시하기 때문에, graph는 n+1만큼, visited도 n+1 만큼, 0은 무시하기 때문에 반복문은 1부터 n+1까지 돌린다.
This post is licensed under CC BY 4.0 by the author.

BOJ 11721번 열 개씩 끊어 출력하기

BOJ 11725번 트리의 부모 찾기 파이썬