Algorithm & Data Structure
Union-Find (합집합 찾기)
philo0407
2020. 10. 27. 21:21
main statement
Union_Find uf = new Union_Find(5);
uf.getParent(1);
uf.unionParent(1, 2);
uf.unionParent(2, 3);
uf.unionParent(4, 5);
uf.whoParent(1);
uf.whoParent(2);
uf.whoParent(3);
uf.whoParent(4);
uf.whoParent(5);
uf.hasSameParent(1, 2);
uf.hasSameParent(4, 5);
uf.hasSameParent(1, 5);
parent of 1 : 1
parent of 2 : 1
parent of 3 : 1
parent of 4 : 4
parent of 5 : 4
1 and 2 has same parent
4 and 5 has same parent
1 and 5 has different parent
==================코드 수정! ==========================
main
Union_Find uf = new Union_Find(5);
uf.union(1, 2);
uf.union(2, 3);
uf.union(4, 5);
System.out.println("============(1,2,3), (4,5) 결합============");
uf.whoParent(1);
uf.whoParent(2);
uf.whoParent(3);
uf.whoParent(4);
uf.whoParent(5);
uf.hasSameParent(1, 2);
uf.hasSameParent(4, 5);
uf.hasSameParent(1, 5);
System.out.println("============모든 원소 결합============");
uf.union(3, 4);
uf.whoParent(4);
uf.whoParent(5);
uf.seperate(3, "alone");
System.out.println("============3을 기준으로 분리============");
uf.whoParent(1);
uf.whoParent(2);
uf.whoParent(3);
uf.whoParent(4);
uf.whoParent(5);
union find
package Algorithms;
public class Union_Find {
int[] parent;
public Union_Find(int n) {
// 0은 미용, 1~n 인덱스 사용
parent = new int[n+1];
for (int i =1; i<parent.length ; i++) {
parent[i] = i;
// System.out.printf("parent[%d] : %d \n", i, parent[i]);
}
}
// 부모를 넘어 조상님을 찾아주는 함수
int getParent(int x) {
if(parent[x] == x) return x;
parent[x] = getParent(parent[x]);
return parent[x];
}
void whoParent(int x) {
System.out.printf("parent of %d : %d \n", x, parent[x]);
}
// 서로 결합해주고 최고 부모를 결정해주는 함수
void union(int a, int b) {
a = getParent(a);
b = getParent(b);
if(a<b) reSetParent(b, a);
else reSetParent(a, b);
}
// 같은 조상을 가지는 지 확인하는 함수
Boolean hasSameParent(int a, int b) {
boolean hasSame = getParent(a) == getParent(b);
String res = "";
res = String.format("%d and %d has", a, b);
if(hasSame) {
res += " same";
} else {
res += " different";
}
res += " parent";
System.out.println(res);
return hasSame;
}
// x를 기준으로 분리하는 함수, 12345가 있으면 예시는 아래와 같다.
// (123),(45) 혹은 (12),(345) 혹은 (12), 3, (45)
// 예를 들어 right 함수의 경우
// 설계상에 구현하기 난이도 있는 함수, 자기의 앞은 볼 수 있고, 뒤는 볼수 없기 때문에,
void seperate(int x, String where) {
if(where.equals("") || where.equals("left")) {
reSetParent(x + 1, x + 1);
}
else if(where.equals("right")) {
reSetParent(x, x);
// 어짜피 x보다 큰 인덱스만이 x를 부모로 가진다.
}
else if(where.equals("alone")) {
parent[x] = x;
reSetParent(x+1, x + 1);
}
else {
throw new IllegalArgumentException("공백, left, right, alone 중에 입력 부탁 드립니다.");
}
}
// 부모를 다시 재 정의해주는 함수, 자기 자신을 포함하면 self가 "self", 아니면 "none"
private void reSetParent(int center, int toBeParent) {
int oldParent = getParent(center);
for(int i= center; i<parent.length; i++) {
if(oldParent == getParent(i)) {
parent[i] = toBeParent;
}
}
}
}
결과
============(1,2,3), (4,5) 결합============
parent of 1 : 1
parent of 2 : 1
parent of 3 : 1
parent of 4 : 4
parent of 5 : 4
1 and 2 has same parent
4 and 5 has same parent
1 and 5 has different parent
============모든 원소 결합============
parent of 4 : 1
parent of 5 : 1
============3을 기준으로 분리============
parent of 1 : 1
parent of 2 : 1
parent of 3 : 3
parent of 4 : 4
parent of 5 : 4
[Java] 문자열 비교하기 == , equals() 의 차이점
자바에서 일반적인 데이터 타입의 비교는 ==이라는 연산자를 사용하여 비교합니다. 하지만 String 문자열의 값을 비교할때에는 ==이 아닌 equals()라는 메소드를 사용하여 비교를 합니다. equals와 ==
coding-factory.tistory.com
내 전 블로그에 달린 댓글 !