연습의 흔적들🚩/백준⚾

[백준] 11724번 연결 요소의 개수 파이썬(Python) 풀이

Dobby98 2022. 10. 31. 14:07
 

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

[문제]


[코드]

import sys
sys.setrecursionlimit(100000)
input = sys.stdin.readline

def dfs(start, depth):

    visited[start]  = True

    for i in graph[start]:
        if not visited[i]:
            dfs(i, depth + 1)

n,m = map(int, input().split())
graph = [[] for _ in range(n+1)]

for _ in range(m):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a)

count = 0
visited = [False] * (n+1)

for i in range(1, n+1):
    if not visited[i]:
        if not graph[i]:
            count += 1
            visited[i] = True
        else:
            dfs(i, 0)
            count += 1

print(count)

[해설]

DFS - 깊이 우선 탐색을 통해서 문제를 풀이하는 방식이다

우선 아래의 부분은 

sys.setrecursionlimit(100000)

지정하지 않으면 백준에서 에러가 뜨기 때문에 깊이의 범위를 설정해준다

 

핵심 코드는 아래의 dfs 코드와

def dfs(start, depth):

    visited[start]  = True

    for i in graph[start]:
        if not visited[i]:
            dfs(i, depth + 1)

for 문을 사용해서 dfs를 돌려 이미 방문했던 곳이면 넘어가고 

아무것도 연결되어 있지 않는 곳이라면 count에 1을 올려주고 방문처리한다

그리고 나머지의 dfs 함수를 돌려서 방문처리한고 count에 1을 올려준다

for i in range(1, n+1):
    if not visited[i]:
        if not graph[i]:
            count += 1
            visited[i] = True
        else:
            dfs(i, 0)
            count += 1