인프런 인강 40강에서 나온 투 포인트 알고리즘.
두 배열에 대한 교집합을 찾아서 새로운 배열에 할당하는 문제인데,
이중 포문을 돌리는 것이 아님 (중요!)
1. 두 배열을 정렬시킴
2. 각 원소를 비교, 만약 같다면 새로운 배열에 배치하고 한개가 작다면 그 배열의 포인트를 증가시킴
이 강의가 중요했던 이유!
- 이중 포문의 저주에 걸린 나의 시각을 조금이나마 넓혀줌
- algorithm 헤더에 sort가 있다는 것을 깨달음
python으로만 했어서 C++ 라이브러리를 전혀 알고있지 않은 상태인데 이렇게라도 알아야한다,,,
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int n,m,i,p1=0,p2=0,p3=0;
scanf("%d",n);
vector<int> a(n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a.begin(), a.end());
scanf("%d",m);
vector<int> b(m), c(n+m);
for(i=0;i<m;i++){
scanf("%d",&b[i]);
}
sort(b.begin(),b.end());
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(i=0;i<p3;i++){
printf("%d",c[i]);
}
return 0;
}
Sort Algorithm
// sort algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::sort
#include <vector> // std::vector
bool myfunction (int i,int j) { return (i<j); }
struct myclass {
bool operator() (int i,int j) { return (i<j);}
} myobject;
int main () {
int myints[] = {32,71,12,45,26,80,53,33};
std::vector<int> myvector (myints, myints+8); // 32 71 12 45 26 80 53 33
// using default comparison (operator <):
std::sort (myvector.begin(), myvector.begin()+4); //(12 32 45 71)26 80 53 33
// using function as comp
std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)
// using object as comp
std::sort (myvector.begin(), myvector.end(), myobject); //(12 26 32 33 45 53 71 80)
// print out content:
std::cout << "myvector contains:";
for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
퀵 정렬 기반으로 구현된 함수라 시간복잡도는 nlogn.
보다시피
-
sort(arr, arr+n);
-
sort(v.begin(), v.end());
-
sort(v.begin(), v.end(), compare); //사용자 정의 함수 사용
-
sort(v.begin(), v.end(), greater<자료형>()); //내림차순 (Descending order)
-
sort(v.begin(), v.end(), less<자료형>()); //오름차순 (default = Ascending order)
형태로 사용 가능하다.
그러니까 위에서 작성한 코드에서도
sort(a.begin(), a.end())
이렇게 해도 되고
sort(a,a+n)
이렇게 해도 된다는 뜻
STL을 하나하나 정리하기에는 솔직히 너무나 귀찮다~~ 문제 풀면서 나오는것 만이라도 정리해두자.
반응형