BACKEND/Data Structure & Algorithm

기초수학 - 집합(Set)

우진하다 2023. 5. 31. 00:22

집합(Set).

기초 수학에서 집합은 (특정조건에 맞는)원소들의 모임을 의미합니다.
집합은 중복되지 않는 원소들로 구성되며, 순서는 중요하지 않습니다.
집합은 중괄호{}로 표현되며, 각 원소는 쉼표로 구분됩니다.
집합을 표현하는 방법으로는 원소나열법, 조건제시법, 벤 다이어그램이 있습니다.
집합에 대해 알아보며 이를 자바 코드로 구현해봅시다.

 

집합 표현 방법.

  • 원소나열법
A = {1, 2, 3, 4, 5}, B = {2, 4, 6, 8, 10}
  • 조건제시법
A = {A | A는 정수, 1 ≦ A ≦ 5 }
B = {2B | B는 정수, 1 ≦ B ≦ 5}
  • 벤 다이어그램

 

교집합.

두 집합이 공통으로 포함하는 원소로 이루어진 집합
A ∩ B = { 𝑥 | 𝑥 ∈ A and  𝑥 ∈ B } 

합집합.

어느 하나에라도 포함되는 원소들을 모두 모은 집합
A ∪ B = { 𝑥 | 𝑥 ∈ A  or 𝑥 ∈ B } 

 

차집합.

A (또는 B)에만 속하는 원소들의 집합
A − B = { 𝑥 | 𝑥 ∈ A  and 𝑥 B }

 

여집합.

전체집합(U) 중 A의 원소가 아닌 것들의 집합

 

자바에서 사용하는 HashSet 메서드.

package day028;

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

public class MathSetTest {
    public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>();
        // 데이터 추가 - 중복값 추가하지 않음
        set.add(1);
        set.add(1);
        set.add(2);
        set.add(3);
        System.out.println(set); // [1, 2, 3]
        // 크기
        System.out.println(set.size()); // 3
        // 삭제
        set.remove(1);
        System.out.println(set); // [2, 3]

        // 집합 A, 집합B
        HashSet<Integer> a = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5));
        HashSet<Integer> b = new HashSet<>(Arrays.asList(2, 4, 6, 8, 10));

        // 교집합
        a.retainAll(b);
        System.out.println(a); // [2, 4]

        // 합집합
        a.addAll(b);
        System.out.println(a); // [2, 4, 6, 8, 10]

        // 차집합
        a.removeAll(b);
        System.out.println(a); // []
    }
}

 

ArrayList로 Set 만들기.

package day028;

import java.util.ArrayList;

class MySet {
    ArrayList<Integer> list;

    MySet() {
        this.list = new ArrayList<>();
    }

    MySet(int[] arr) {
        this.list = new ArrayList<>();
        for(int n : arr) {
            this.list.add(n);
        }
    }

    // add 구현하기, 중복 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 item : this.list) {
            for (int itemB : b.list) {
                if (item == itemB) {
                    result.add(item);
                }
            }
        }
        return result;
    }

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

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

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

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

        for (int item : this.list) {
            boolean retainFlag = false;

            for (int itemB : b.list) {
                if (item == itemB) { // a 의 원소와 b의 원소가 같다면 
                    retainFlag = true; // 트루로 변경하고
                    break; // 멈춤
                }
            }
            if (!retainFlag) { // false면 
                result.add(item); // a에 남는 원소가 되니까 결과에 add 반복
            }
        }
        return result;
    }
}
public class MathMySetTest {
    public static void main(String[] args) {
        MySet a = new MySet();
        a.add(1);
        a.add(1);
        a.add(2);
        a.add(3);
        System.out.println(a.list); // [1, 2, 3]

        a = new MySet(new int[] {1, 2, 3, 4, 5});
        MySet b = new MySet(new int[] {2, 4, 6, 8, 10});

        MySet result = a.retainAll(b);
        System.out.println(result.list); // [2, 4]

        result = a.addAll(b);
        System.out.println(result.list); // [1, 2, 3, 4, 5, 6, 8, 10]

        result = a.removeAll(b);
        System.out.println(result.list); // [1, 3, 5]
    }
}