집합(Set)

JH·2024년 3월 7일

기초 수학

목록 보기
1/7

집합은 수학에서 중요한 개념 중 하나로, 고유한 요소들의 모임을 의미합니다. 자바에서도 집합을 다루기 위한 Set 인터페이스와 그 구현체들을 제공하고 있습니다.

1. 집합(Set)이란?

집합은 중복된 원소를 허용하지 않고, 순서가 없는 요소들의 모임입니다. 이를 수학적으로 표현할 때 중괄호 {}를 사용하여 요소들을 나열합니다. 예를 들어, {1, 2, 3}은 1, 2, 3이라는 요소들로 구성된 집합을 나타냅니다.

2. 자바에서의 집합(Set)

자바에서는 집합을 다루기 위한 인터페이스인 Set을 제공하고 있습니다. Set은 중복된 요소를 허용하지 않으며, 순서가 없는 집합을 나타내는 인터페이스입니다. 대표적으로 사용되는 Set 구현 클래스로는 HashSet, TreeSet, LinkedHashSet 등이 있습니다.

  • HashSet
    해시 테이블을 사용하여 집합을 구현한 클래스로, 요소의 추가, 제거, 검색에 O(1)의 시간 복잡도를 가집니다. 순서를 보장하지 않습니다.

  • TreeSet
    이진 검색 트리를 사용하여 집합을 구현한 클래스로, 요소의 추가, 제거, 검색에 O(log n)의 시간 복잡도를 가집니다. 요소들을 기본적으로 정렬된 상태로 유지합니다.

  • LinkedHashSet
    해시 테이블과 연결 리스트를 사용하여 집합을 구현한 클래스로, 요소의 추가, 제거, 검색에 O(1)의 시간 복잡도를 가지면서도 삽입 순서를 유지합니다.

3. 집합 연산

집합 연산은 집합 간의 합집합, 교집합, 차집합, 여집합 등의 연산을 의미합니다. 자바에서는 Set 인터페이스를 구현한 클래스들을 이용하여 다양한 집합 연산을 수행할 수 있습니다.

  • 합집합(Union)
    두 집합의 모든 요소를 포함한 집합을 생성합니다.

  • 교집합(Intersection)
    두 집합에 공통으로 포함된 요소들로 구성된 집합을 생성합니다.

  • 차집합(Difference)
    한 집합에는 포함되지만 다른 집합에는 포함되지 않는 요소들로 구성된 집합을 생성합니다.

  • 여집합(Complement)
    전체 집합에서 특정 집합을 빼고 남은 요소들로 구성된 집합을 생성합니다.

4. 집합의 활용

집합은 데이터 중복을 피하고 고유한 요소들을 관리하는 데에 유용하게 사용됩니다. 예를 들어, 중복된 값이 없는 명단이나 고유한 아이템을 관리할 때 집합을 사용할 수 있습니다.

5. 자바 코드 예시

import java.util.Arrays;
import java.util.HashSet;

public class Main {
    public static void main(String[] args) {

//      1. 자바에서 집합 사용 - HashSet
        System.out.println("== HashSet ==");
        HashSet set1 = new HashSet();
        set1.add(1);
        set1.add(1);
        set1.add(1);
        System.out.println("set1 = " + set1);
        set1.add(2);
        set1.add(3);
        System.out.println("set1 = " + set1);
        set1.remove(1);
        System.out.println("set1 = " + set1);
        System.out.println(set1.size());
        System.out.println(set1.contains(2));


//      2. 집합 연산
        System.out.println("== 집합 연산 ==");

//      2-1. 교집합
        HashSet a = new HashSet(Arrays.asList(1, 2, 3, 4, 5));
        HashSet b = new HashSet(Arrays.asList(2, 4, 6, 8, 10));
//        a.retainAll(b);
//        System.out.println("교집합: " + a);


//      2-2. 합집합
//        a.addAll(b);
//        System.out.println("합집합: " + a);


//      2-3. 차집합
        a.removeAll(b);
        System.out.println("차집합: " + a);

    }

}
// ArrayList를 사용한 집합 구현 (집합 관련 연산 사용 X)

import java.util.ArrayList;

class MySet {
    // ArrayList
    ArrayList<Integer> list;

    // 생성자1
    MySet() {
        this.list = new ArrayList<>();
    }

    // 생성자 2
    MySet(int[] arr) {
        this.list = new ArrayList<>();

        for (int item : arr) {
            this.list.add(item);
        }
    }

    // 원소 추가 (중복 X)
    public void add(int x) {
        for (int item : this.list) {
            if (item == x) {
                return;
            }
        }
        this.list.add(x);
    }

    // 교집합
    public MySet retainAll(MySet b) {
        MySet result = new MySet();

        for (int itemA : this.list) {
            for (int itemB : b.list) {
                if (itemA == itemB) {
                    result.add(itemA);
                }
            }
        }
        return result;
    }

    // 합집합
    public MySet addAll(MySet b) {
        MySet result = new MySet();

        for (int itemA : this.list) {
            result.add(itemA);
        }

        for (int itemB : b.list) {
            result.add(itemB);
        }
        return result;
    }

    // 차집합
    public MySet removeAll(MySet b) {
        MySet result = new MySet();

        for (int itemA : this.list) {
            boolean containFlag = false;

            for (int itemB : b.list) {
                if (itemA == itemB) {
                    containFlag = true;
                    break;
                }
            }

            if (!containFlag) {
                result.add(itemA);
            }
        }

        return result;
    }
}

public class Practice {
    public static void main(String[] args) {
        MySet a = new MySet();

        a.add(1);
        a.add(1);
        a.add(1);
        System.out.println(a.list);
        a.add(2);
        a.add(3);
        System.out.println(a.list);

        a = new MySet(new int[]{1, 2, 3, 4, 5});
        MySet b = new MySet(new int[]{2, 4, 6, 8, 10});
        System.out.println("a: " + a.list);
        System.out.println("b: " + b.list);

        MySet result = a.retainAll(b);
        System.out.println("교집합: " + result.list);

        result = a.addAll(b);
        System.out.println("합집합: " + result.list);

        result = a.removeAll(b);
        System.out.println("차집합: " + result.list);
    }
}
profile
발전하는 백엔드 개발자

0개의 댓글