A, B 두 개의 집합이 주어지면 두 집합의 공통 원소를 추출하여 오름차순으로 출력하는 프로그램을 작성하세요.
첫 번째 줄에 집합 A의 크기 N(1<=N<=30,000)이 주어집니다.
두 번째 줄에 N개의 원소가 주어집니다. 원소가 중복되어 주어지지 않습니다.
세 번째 줄에 집합 B의 크기 M(1<=M<=30,000)이 주어집니다.
네 번째 줄에 M개의 원소가 주어집니다. 원소가 중복되어 주어지지 않습니다.
각 집합의 원소는 1,000,000,000이하의 자연수입니다.
두 집합의 공통원소를 오름차순 정렬하여 출력합니다.
예제입력
5
1 3 9 5 2
5
3 2 5 7 8
예제출력
2 3 5
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i=0; i<n; i++) {
arr[i] = sc.nextInt();
}
int m = sc.nextInt();
int[] arr1 = new int[m];
for (int i=0; i<m; i++) {
arr1[i] = sc.nextInt();
}
sc.close();
for (int i : solution(n, m, arr, arr1)) {
System.out.print(i + " ");
}
}
public static ArrayList<Integer> solution(int n, int m, int[] arr, int[] arr1) {
ArrayList<Integer> answer = new ArrayList<Integer>();
Arrays.sort(arr);
Arrays.sort(arr1);
int p1 = 0, p2 = 0;
while (p1<n && p2<m) {
if (arr[p1] == arr1[p2]) {
answer.add(arr[p1]);
p1++;
p2++;
}
else if (arr[p1] < arr1[p2]) {
p1++;
}
else {
p2++;
}
}
return answer;
}
}
투포인터 알고리즘을 사용해서 풀었다
해당 알고리즘을 사용하기 위해서 우선 배열은 정렬이 되어있어야하기 때문에 arr, arr1을 각각 정렬부터 해주었다.
p1, p2 변수를 만들어 0으로 초기화하고 배열을 순회하며 p1,p2가 같을 떄 answer에 추가해주었다.
각 배열은 정렬이 되어있기 떄문에 arr[p1] 이 arr1[p2]보다 작으면 arr배열에는 그 전까지 해당 공통원소가 없기때문에 p1++을 해주는 것이고 반대인 경우에는 p2++를 해주면 된다.
이중 for문을 통해서 문제를 풀 수 있지만 N의 크기가 커지면 시간 복잡도가 그만큼 엄ㅊ어 늘어나서 풀 수 없기 때문에 투포인터 알고리즘을 통해서 풀면 된다.