본문 바로가기
카테고리 없음

C++/ 교집합(투 포인트 알고리즘) + STL sort

by RunningonEmpty 2020. 11. 8.

인프런 인강 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을 하나하나 정리하기에는 솔직히 너무나 귀찮다~~ 문제 풀면서 나오는것 만이라도 정리해두자.

 

 

반응형