집합(2)

황상익·2023년 10월 25일
0

자료구조 정리

목록 보기
8/13

<기본 사용 코드>

//      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("== 집합 연산 ==");
        HashSet a = new HashSet<>(Arrays.asList(1,2,3,4,5));
        HashSet b = new HashSet<>(Arrays.asList(2,4,6,8,10));

//      2-1. 교집합
        a.retainAll(b);
        System.out.println("a = " + a);


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

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

<집합을 이용한 연습문제>

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) { //리스트에 있는 원소들을 순회 하면서, add 하려는 데이터와 레스트에 있는 데이터 비교
            if (item == x) {
                return; // 같은게 있다면 데이터 추가 안할 것
            }
        }
        this.list.add(x); // 그렇지 않으면 추가
    }

    // 교집합
    public MySet retainAll(MySet b) { //a로 된 내용은 그대로 두고, 교집합된 집합을 새로 생성된 집합 생성
        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 c) {
        MySet result = new MySet();

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

        for (int itemB :
                c.list) {
            result.add(itemB);
        }
        // 중복을 추가 하지 않고 add
        return result;
    }

    // 차집합
    public MySet removeAll(MySet d) {
        MySet result = new MySet();
        for (int itemA :
                this.list) {
            boolean containFlag = false; // 같은 값이 없다는 의미

            for (int itemB :
                    d.list) {
                if (itemA == itemB) {
                    containFlag = true;
                    break;
                }
                //현재 집합의 리스트를 순회 하면서, 차집합에 대상 리스트를 순회
                //같은 원소가 있으면 마이나스
                //원소 있는지 없는지 (containFlag = T,F)
            }
            if (!containFlag) {
                result.add(itemA);
            }
        }
        return result;
    }
}
profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글