문제 풀이 (JAVA)
package algorithm;
import java.util.*;
public class part3_2 {
public static void main(String[] args) {
// 공통원소 구하기
Scanner input = new Scanner(System.in);
int N = input.nextInt();
int [] arr1 =new int[N];
for(int i=0; i<N; i++) {
arr1[i]=input.nextInt();
}
int M = input.nextInt();
int [] arr2 = new int[M];
for(int i=0; i<M; i++) {
arr2[i]=input.nextInt();
}
int [] answer = solution(N,arr1,M,arr2);
for(int i=0; i<answer.length; i++) {
System.out.print(answer[i]+" ");
}
}
private static int [] solution(int N, int [] a, int M, int [] b) {
List<Integer> list = new ArrayList<>();
int p1 =0 , p2=0; // 투포인터 선언
// 오름차순 정렬
Arrays.sort(a);
Arrays.sort(b);
while(p1 < N && p2< M) { // 각 배열이 포인터가 끝을 바라보지 않는다면
if(a[p1] == b[p2]) {
list.add(a[p1]);
p1++; p2++;
}else if(a[p1] < b[p2]) {
p1++;
}else if(a[p1] > b[p2]) {
p2++;
}
}
int [] result = new int[list.size()];
for(int i=0; i< list.size(); i++) {
result[i]=list.get(i);
}
return result;
}
}
주요 핵심 포인트
1. 기존에는 for문으로 풀었으나 O(n2)번 비교하므로 효율성테스트에서 시간 초과 오류로 문제가 풀리지 않는다.
2. 투포인터 알고리즘의 핵심 개념인 2개의 포인터를 사용하여 O(n)번 탐색하도록 변경한다.
3. while문을 통해 포인터가 각배열의 끝을 가리키지 않는다면, 반복하여 탐색한다.
4. 숫자는 오름차순 정렬 되었으므로 각 숫자가 작을시 작은 배열의 포인터를 증가시킨다.
'알고리즘' 카테고리의 다른 글
[해쉬맵] 학급 회장(해쉬) (인프런 알고리즘 4-1) (0) | 2022.06.12 |
---|---|
[투포인터+슬라이딩윈도우] 최대 길이 연속부분수열 (인프런 알고리즘 3-6) (0) | 2022.06.12 |
[투포인터+슬라이딩윈도우] 연속된 자연수의 합 (인프런 알고리즘 3-5) (0) | 2022.06.12 |
[슬라이딩윈도우] 최대 매출 (인프런 알고리즘 3-3) (0) | 2022.06.12 |
[이차원배열탐색] 봉우리 (인프런 알고리즘 2-10) (0) | 2022.06.12 |