boj 1931번 문제를 통해 vector로 원소를 만들고 값을 복사해서 받아들일때와, 배열로 잡고 바로 cin으로 받아들일때의 메모리의 차이점.

처음에 boj 1931번 문제를 풀었을때, 나의 풀이를 첨부해보자면

#include <bits/stdc++.h>
using namespace std;

vector<pair<int,int>> v;

int main(){
    ios::sync_with_stdio(0); 
    cin.tie(0); 

    int n;
    cin>>n;
    for(int i=0; i<n; i++){
        int a, b;
        cin>>a>>b;
        v.push_back({b,a});
    }
    sort(v.begin(),v.end());
    int cnt=1;
    int now=v[0].first;
    for(int i=1; i<n; i++){
        if(now<=v[i].second) {
            now=v[i].first;
            cnt++;
        }
    }
    cout<<cnt;
}

 

그리고 내가 접한 코드를 통해서 내 코드를 변경해보면, 

#include <bits/stdc++.h>
using namespace std;

pair<int,int> s[100'005];

int main(){
    ios::sync_with_stdio(0); 
    cin.tie(0); 

    int n;
    cin>>n;
    for(int i=0; i<n; i++){
        cin>>s[i].second>>s[i].first;
    }
    sort(s,s+n);
    int cnt=1;
    int now=s[0].first;
    for(int i=1; i<n; i++){
        if(now<=s[i].second) {//처음에 = 을 빼먹어서 들렸다. 몇몇 문제에서 등호 관계를 같이 고려해주지 않아서 틀리고 있다. 대소관계를 비교해야 하는경우 등호를 포함해도 되는지 안되는지에 대해서 확실하게 고민해보고 문제를 해결하도록 하자. 
            now=s[i].first;
            cnt++;
        }
    }
    cout<<cnt;
}

 

이런 형태일때, 둘이 메모리 사용에서 차이가 발생한다. 그 차이에 대해서 알아보기 위해서 지피티에 검색을 해보면, 

 

이런식의 답을 얻을 수 있다. 

추가적으로 궁금한 부분에 대한 질문을 하였을때, 

 

 

전체적으로 검색을 통해 알게된 내용들을 토대로 생각해보면, vector로 설정할때 동일한 개수로 변수를 잡더라도 vector 자체가 그러한 동적 배열을 만들어주기 위해 메모리를 추가적으로 더 사용하는것으로 보인다. 

 

추가적인 궁금증으로, 

지금까지 c++을 알고리즘 용으로 가볍게 공부해서, c#을 사용할때는 있었던 garbage collector에 대해서 검색해보았는데, 

이런 답변을 얻을 수 있었다. 

아무래도 내가 현재 사용하는 수준에서는 c++을 사용할때 new와 delete를 사용할 일이 없어서 생소한데, 일단은 알고리즘 문제해결 수준에서의 c++에 더욱 더 익숙해진뒤에 추가적으로 공부를 통해 알아보도록 하자. 

 

  Comments,     Trackbacks