300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 킥스타트
- 운영체제
- 동적프로그래밍
- 순열
- 구글 킥스타트
- 알고리즘
- 딥러닝
- 코딩 테스트
- 파이썬
- 동적 프로그래밍
- google coding competition
- AI
- 코딩
- BFS
- linux
- 리눅스
- kick start
- dp
- 프로그래밍
- nlp
- 코딩테스트
- 백준
- 그래프
- OS
- PYTHON
- 네트워크
- CSS
- 프로그래머스
- 브루트포스
- DFS
Archives
- Today
- Total
오뚝이개발자
[자료구조 및 알고리즘] DFS로 connected component 구하기(union find) 본문
728x90
300x250
DFS를 활용해 connected component의 갯수를 구하는 것이 필요할 때가 있다. 이럴 땐 탐색을 하면서 각 unit별로 구분을 해서 갯수를 카운트 해주면 된다. 정확히는 이를 union find 알고리즘이라고 한다.
예제를 통해 이해해보자. 아래 문제는 프로그래머스에 수록된 문제이다.
programmers.co.kr/learn/courses/30/lessons/43162
def dfs(start, n, visited, computers):
for i in range(n):
if (i!=start) and (visited[i]==0) and (computers[start][i]==1):
visited[i]=1
dfs(i, n, visited, computers)
def solution(n, computers):
answer = 0
# 방문하면 1로 flag up
visited = [0 for _ in range(n)]
for i in range(n):
if visited[i]==1:
continue
answer+=1
dfs(i, n, visited, computers)
return answer
위의 solution 함수에서 for문을 사용해 방문하고 answer+=1해주는 부분이 바로 connected component를 카운트하는 핵심이다. i에 방문을 하면 dfs(i)를 호출하게 되고 이 때 i와 연결된 여러 점들을 방문하고 방문처리한다. 그래서 dfs함수를 탈출하고나선 이미 i와 연결된 점들은 다 방문을 한 상태가 되어버린다. 따라서 solution 함수의 for문을 돌면서 visited가 False인 경우에만 방문을 다시 시도하게 되고 바로 이 때 answer를 +1 해주면 된다.
728x90
300x250
'CS 기초 > 자료구조 및 알고리즘' 카테고리의 다른 글
위상정렬 (0) | 2021.07.04 |
---|---|
[자료구조 및 알고리즘] 계수 정렬(Counting sort) (0) | 2020.12.02 |
[자료구조 및 알고리즘] 너비우선탐색(BFS) (0) | 2020.10.27 |
[자료구조 및 알고리즘] 깊이우선탐색(DFS) (0) | 2020.10.27 |
[자료구조 및 알고리즘] CH12. Dynamic programming(동적프로그래밍) (0) | 2020.10.27 |
Comments