Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Design Pattern
- a
- designPattern
- 디자인패턴
- 싱글톤
- factory method
- Observer Pattern
- 코틀린
- 추상팩토리패턴
- Kotlin
- 추상 팩토리
- Abstract Factory
- 디자인패턴 #
- 함수형프로그래밍
- builderPattern
- ㅋㅁ
- 빌터패턴
- 옵저버 패턴
- Functional Programming
- ㅓ
- 팩토리 메소드
- PrototypePattern
- r
- F
- Singleton
- 프로토타입 패턴
- El
Archives
- Today
- Total
오늘도 더 나은 코드를 작성하였습니까?
서로소 집합 DSU(Disjoint set - Union) / 합집합 찾기 (Union-Find) kotlin 본문
Algorithm/개념
서로소 집합 DSU(Disjoint set - Union) / 합집합 찾기 (Union-Find) kotlin
hik14 2023. 11. 15. 19:47
Disjoint Set(서로소 집합)
- 서로 공통된 원소를 가지고 있지 않은 두 개 이상의 집합
DSU(Disjoint Set Union)
- 데이터 구조는 여러개의 서로소 집합(겹치지 않도록) 원소(데이터)를 저장하는 자료구조이다.
- union–find 또는 merge-find 라고도 부른다.
- 두 서로소 집합을 합쳐 하나의 집합으로 만들 수 있다(union)
- 2개의 서로 다른 원소가 같은 집합인지 "대표원소를 통해" 확인할 수 있다(find)
구현
예) 총 원소가 0번 원소부터 7번까지 8개의 원소가 있다고 가정하고,
처음에는 자기 자신만을 포함하는 총 8 개의 집합이 있다고 가정해 보자.
배열로 Index는 해당 원소, value는 속한 집합의 "대표원소" 이다.
* 대표원소를 결정하는 방법은 다양하다 여기선 집합의 가장 작은 값으로 한다.
여기서 만약 2번 집합과 3번 집합 합쳐지고(union) 5번 집합과 6번 집합 합쳐(union)지면,
union(2, 3) 2-3 집합의 대표는 2
union(5, 6) 5-6 집합의 대표는 5
더 많은 집합들이 서로 합쳐지면 아래와 같이 표현 할 수 있다.
union(3, 5)
kotlin code
/*
재귀적으로 해당 idx의 집합 대표값을 찾아서
변경하고, 반환함.
*/
fun searchParent(n: Int): Int =
if (arr[n] == n)
n
else {
arr[n] = searchParent(arr[n])
arr[n]
}
/*
각 원소의 대표값을 찾아서 변경하여 하나의 집합으로 표현해준다.
*/
fun union(a: Int, b: Int) {
val parentA = searchParent(a)
val parentB = searchParent(b)
if (parentA < parentB) {
arr[parentB] = parentA
} else {
arr[parentA] = parentB
}
}
/*
두 원소가 같은 대표값을 가지는지 확인 한다.
*/
fun find(a: Int, b: Int): Boolean =
searchParent(a) == searchParent(b)
val arr = Array(10) { it }
fun main() {
union(1,2)
union(8,9)
println(arr.joinToString(" "))
union(1,8)
println(arr.joinToString(" "))
println(find(2,9))
}
'Algorithm > 개념' 카테고리의 다른 글
백트레킹(BackTracking) (3) | 2023.11.23 |
---|---|
완전탐색(Brute-Force Search / Exhaustive Search) (1) | 2023.11.22 |
최장 증가 부분 수열 (LIS, Longest Increasing Subsequence) feat.kotlin (0) | 2023.11.06 |
비트마스킹(BitMask) 활용 feat. kotlin (1) | 2023.10.27 |
비트 연산을 활용한 비트 마스킹(BitMask) feat. kotlin (0) | 2023.10.25 |