두개의 배열에서 공통 요소(교집합)를 구하는 방법에 대해서 알아보겠습니다.

1. Set를 이용한 방법

Set는 retainAll()이라는 함수가 있습니다. set1.retainAll(set2)는 set1에서 set2와의 교집합 요소들만 남기고 다른 요소들을 모두 삭제합니다. 이 함수를 이용하여 교집합을 구할 수 있습니다.

  • 먼저 배열을 Set로 변환
  • set1.retainAll(set2) : set1과 set2의 공통 요소만 남기고 모두 제거
  • int result[] = set1.stream().mapToInt(i -> i.intValue()).toArray() : Set를 배열로 변환
import java.util.*;

public class Example {

    public static void main(String[] args) {

        int[] array1 = {1, 2, 3, 4, 5};
        int[] array2 = {3, 4, 5, 6, 7};

        // 배열을 Set으로 변환
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> set2 = new HashSet<>();
        for (int num : array1) {
            set1.add(num);
        }
        for (int num : array2) {
            set2.add(num);
        }

        // set1과 set2의 공통 요소만 남기고 모두 제거
        set1.retainAll(set2);

        // Set를 배열로 변환
        int result[] = set1.stream().mapToInt(i -> i.intValue()).toArray();

        // 교집합 배열 출력
        System.out.println("Intersection: " + Arrays.toString(result));
    }
}

Output:

Intersection: [3, 4, 5]

2. for문을 이용한 방법

2중 for문으로 두개의 배열을 순회하면서 공통 요소를 다른 리스트에 저장할 수 있습니다. 교집합 연산이 끝나고, 리스트는 다시 배열로 변환할 수 있습니다.

import java.util.*;

public class Example {

    public static void main(String[] args) {

        int[] array1 = {1, 2, 3, 4, 5};
        int[] array2 = {3, 4, 5, 6, 7};

        // 공통 요소만 리스트에 저장
        List<Integer> list = new ArrayList<>();
        for (int num1 : array1) {
            for (int num2 : array2) {
                if (num1 == num2) {
                    list.add(num1);
                    break;
                }
            }
        }

        // List를 배열로 변환
        int result[] = list.stream().mapToInt(i -> i.intValue()).toArray();

        // 교집합 배열 출력
        System.out.println("Intersection: " + Arrays.toString(result));
    }
}

Output:

Intersection: [3, 4, 5]

3. Stream을 이용한 방법

Set를 이용한 방법과 동일한데, 배열을 Set로 변환할 때 Stream을 사용하여 짧은 코드로 변환할 수 있습니다.

  • Arrays.stream(array1).boxed().collect(Collectors.toSet()) : array1을 Set로 변환
import java.util.*;
import java.util.stream.Collectors;

public class Example {

    public static void main(String[] args) {

        int[] array1 = {1, 2, 3, 4, 5};
        int[] array2 = {3, 4, 5, 6, 7};

        Set<Integer> set1 = Arrays.stream(array1).boxed().collect(Collectors.toSet());
        Set<Integer> set2 = Arrays.stream(array2).boxed().collect(Collectors.toSet());

        // 공통 요소만 남기기 (교집합)
        set1.retainAll(set2);

        // Set를 배열로 변환
        int result[] = set1.stream().mapToInt(i -> i.intValue()).toArray();

        // 교집합 배열 출력
        System.out.println("Intersection: " + Arrays.toString(result));
    }
}

Output:

Intersection: [3, 4, 5]