# Binary Tree (숫자찾기 게임 생각하기 - 계속 중간값 부르지?)
## Set
// - 중복된 요소를 허용하지 않고, 순서를 보장하지 않는 집합
// - 이는 자료의 고유성을 유지하고, 집합 연산(교집합, 합집합, 차집합 등)을 수행하기 위해 사용됨
// - ex) UpDown게임할때 중간값을 계속 부르지?
// --> Binary Tree(Root가 제일 위에있고, 17을 부르면 왼쪽은 ~16 오른쪽은 18~ 이렇게 계속 뻗어나가)
//
# 특징(로또 추첨이랑 특징이 비슷하군):
//
// 1. 중복 요소 허용하지 않음: Set은 동일한 요소를 중복해서 저장하지 않습니다.
// --> 따라서 Set 내에는 고유한 요소만 포함됩니다.
//
// 2. 순서를 보장하지 않음: Set은 요소의 저장 순서를 보장하지 않습니다.
// --> 즉, 요소를 저장한 순서대로 요소에 접근할 수 없습니다.(그래도 비교적 탐색은 빠르지)
// --> 운이 안좋으면 트리가 편향되어 한쪽을 주르륵 다~ 확인하고 없으면 다시 반대쪽을 봐야할수도....
//
// 3. 특정값을 추출하는 get이 없음
//
// 4. 출력 시 : 사실상 정렬이 돼서 나온다!
// HashSet 생성
Set<String> set = new HashSet<>();
// 요소 추가
set.add("사과");
set.add("바나나");
set.add("딸기");
set.add("바나나"); // 중복 요소, 추가되지 않음
// 요소 확인
System.out.println("Set에 있는 요소 수: " + set.size());
// 요소 순회 및 출력
for (String fruit : set) {
System.out.println(fruit);
}
// 요소 제거
set.remove("사과");
// 제거 후 요소 순회 및 출력
System.out.println("사과를 제거한 후:");
for (String fruit : set) {
System.out.println(fruit);
}
// Set 비우기
set.clear();
// 비운 후 요소 확인
System.out.println("Set 비운 후 요소 수: " + set.size());
// 1. HashSet을 사용하여 Set을 생성하고, 중복 요소를 추가해도 중복되지 않음을 확인
// 2. 그 후 요소를 순회하여 출력하고, 일부 요소를 제거한 후 다시 순회하여 출력.
// 3. 마지막으로 Set을 비워 요소 수를 확인합니다.
--> Set은 중복을 허용하지 않고 고유한 요소를 관리하므로,
요소의 고유성을 유지하거나 집합 연산을 수행해야 하는 경우에 유용함
# 예시
// Tree
TreeSet<Integer> set = new TreeSet<>(); // 1) Integer로 래핑돼있음
set.add(10);
set.add(15);
set.add(7);
set.add(4);
set.add(15); // (boolean타입의) add에서 return false를 추고, 추가되지 않겠지
// 2) int로 언박싱하기!
for(int add : set) {
System.out.println(add);
}
// 출력 : 4, 7, 10, 15
// --> Root부터 시작해서 무조건 제일 왼쪽으로가고, null값까지 출력, 다시 남은것중 제일 왼쪽...
// --> 알아서 작은것부터 정렬돼서 출력된다는거임!
// 간략히 표현하자면
class Node<E>{
E value;
Node<E> left;
Node<E> right;
}
## SET의 주요 장점
// 1. 출력시 정렬돼서 나오는 것
// 2. add시 boolean타입을 거쳐서 중복을 안만드는 것
// 3. ★ contains --> 탐색이 빠르다!!!
## SET의 절대하면 안되는 API
// 1. remove는 절대절대 X (link하나가 빠지면 트리자체가 달라져서 재구성을 해야해...)
# 추가내용
TreeSet<AAA> set = new TreeSet<>();
AAA a1 = new AAA();
AAA a2 = new AAA();
AAA a3 = new AAA();
AAA a4 = new AAA();
set.add(a1);
// Comparable 인터페이스를 구현하여 해당 클래스의 인스턴스들을 비교할 수 있는 방법을 제공..
// deep하긴해. 이정도까지는 아직 X
class AAA implements Comparable<AAA>{
int v1;
int v2;
@Override
public int compareTo(AAA o) {
if(this.v1 + this.v2 > o.v1 + o.v2) {
return 1;
}
return -1;
}
'JAVA > DAY 19 _ 23.09.12' 카테고리의 다른 글
자료구조 summary, 시간복잡도 (0) | 2023.09.12 |
---|---|
HashMap2 (0) | 2023.09.12 |
HashMap (4) | 2023.09.12 |
Queue (0) | 2023.09.12 |
(collection framework의) Stack (0) | 2023.09.12 |