투포인트 알고리즘
- 이중 포문으로 O(N^2)이 아닌 1초안에 답이 나오게 하기 위한 알고리즘
예제)
풀이
- STEP1)A배열, B배열, C배열(교집합배열)을 만든다.
- STEP2)A배열 0번째, B배열 0번째 비교해서 (A[0] < B[0])이면 A 배열의 포인터를 +1 만큼 증가 시킨다. 즉 더 작은 값의 배열을 +1 증가 시킨다.
- STEP2,3)A[1] == B[0] 이면 그 값을 C[0]에 넣고 C[cnt++]해준다. 또한, A배열, B배열 포인터를 +1 만큼 증가시킨다.
- STEP4)누군가 하나의 배열이 끝나면 종료.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n, m, i, p1 = 0, p2 = 0, p3 = 0;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a.begin(), a.end());
cin >> m;
vector<int> b(m), c(n + m);
for (int i = 0; i <m; i++)
{
cin >> b[i];
}
sort(b.begin(), b.end());
//2point
while (p1 < n && p2 < m)
{
if (a[p1] == b[p2])
{
c[p3++] = a[p1++];
p2++;
}
else if (a[p1] < b[p2])
p1++;
else
p2++;
}
for (int i = 0; i < p3; i++)
cout << c[i] << " " ;
return 0;
}
'Algorithm > Algorithm_Tip' 카테고리의 다른 글
[Tip] 문자열 짜르기 (0) | 2020.09.17 |
---|---|
[C++] 대문자 <-> 소문자 변경 (0) | 2020.09.16 |
[Java 입출력] StringTokenizer (0) | 2020.09.08 |
[JAVA 입력 TIP] (0) | 2020.09.08 |
[입력] getline으로 한 줄 띄어쓰기 까지 다 받아오기 (0) | 2020.08.06 |