728x90
반응형
▷ 문제
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 6 7 9
▷ 출력 예시
2 3 5
▷ 풀이
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public ArrayList<Integer> solution(int n, int m, int[] nArr, int[] mArr){
ArrayList<Integer> answer = new ArrayList<>();
int p1=0, p2=0; // 포인터 변수 선언
Arrays.sort(nArr);
Arrays.sort(mArr);
while(p1<n && p2<m){
if(nArr[p1] == mArr[p2]) {
answer.add(nArr[p1++]);
p2++;
} else if(nArr[p1] < mArr[p2]){
p1++;
} else{
p2++;
}
}
return answer;
}
public static void main(String[] args){
Main main = new Main();
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
int[] nArr = new int[n];
for(int i=0 ; i<n; i++){
nArr[i] = kb.nextInt();
}
int m = kb.nextInt();
int[] mArr = new int[m];
for(int i=0 ; i<m ; i++){
mArr[i] = kb.nextInt();
}
for(int x : main.solution(n, m, nArr, mArr)){
System.out.print(x + " ");
}
}
}
▷ 핵심 포인트
1. 포인터 변수를 사용하여 간단히 공통 원소를 찾아낼 수 있습니다.
반응형
'Algorithm > Two pointers, Sliding window' 카테고리의 다른 글
[알고리즘]최대 길이 연속부분수열 (0) | 2021.10.19 |
---|---|
[알고리즘]입력받은 수가 연속된 자연수의 합으로 이루어지는 경우의 수 (0) | 2021.10.18 |
[알고리즘]연속 부분수열 (0) | 2021.10.18 |
[알고리즘]최대 매출 - 배열에서 연속된 요소 N개의 최대 합 구하기 (0) | 2021.10.18 |
[알고리즘]두 배열 합치기 및 오름차순 정렬 (0) | 2021.10.17 |