[Java] 배열 교집합 구하기, 3가지 방법
May 04, 2024
두개의 배열에서 공통 요소(교집합)를 구하는 방법에 대해서 알아보겠습니다.
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]