본문 바로가기

알고리즘

Boj 2036 c++ 수열의 점수

수를 크기 순으로 정렬하고, 0, 1에 대한 예외처리를 해준뒤, 절댓값이 큰 순서대로 곱해서 더해주면 되는 문제.

두가지 코드로 풀었다. 0에 대한 예외처리를 빼먹기 쉽기에 주의.

 

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;


int main(){


  int N, zero=0, add=0;

  long long sum=0;

  vector<long long> p;
  vector<long long> n;


  cin>>N;
  vector<int> v(N);


  for(int i=0; i<N; i++){
    cin>>v[i];

    if(v[i]>0){

        if(v[i]==1){
            add++;
        }
        else{
            p.push_back(v[i]);
        }
    }

    else if(v[i]<0){

        n.push_back(v[i]);
    }
    else{
        zero++;
    }
  }

    if(p.size()>0){
    sort(p.begin(), p.end());
    reverse(p.begin(), p.end());}
    if(n.size()>0){
    sort(n.begin(), n.end());}
    
   if(p.size()>0){
   for(int i=1; i<=p.size()-1; i+=2){
         sum+=(p[i-1]*p[i]);
   }
   if(p.size()%2==1){
       sum+=p[p.size()-1];
   }
   }
   if(n.size()>0){
   for(int i=1; i<=n.size()-1; i+=2){
        sum+=(n[i-1]*n[i]);
   }
   if(n.size()%2==1 && zero==0){
        sum+=n[n.size()-1];
   }}

   sum+=add;

   cout<<sum;


}​

 

 

음수인 경우, 양수인 경우, 0인 경우, 1인 경우를 모두 나눈 경우

 

 

 

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;


int main(){


  long long N, p_cnt=0, n_cnt=0, zero=0;
  long long sum=0;

  cin>>N;
  vector<long long> v(N);

  for(int i=0; i<N; i++){
    cin>>v[i];

    if(v[i]>0){
        p_cnt++;
    }
    else if(v[i]<0){
        n_cnt++;
    }
    else{
        zero++;
    }
  }
    sort(v.begin(), v.end());

  if(n_cnt==0){
    for(int i=N-1; i>N-p_cnt; i-=2){
        sum+=max((v[i]*v[i-1]*1LL), (v[i]+v[i-1]));
    }
    if(p_cnt%2==1){
        sum+=v[N-p_cnt];
    }
    cout<<sum;

    } else if(p_cnt==0) {

    for(int i=0; i<n_cnt-1; i+=2){
        sum+=(v[i]*v[i+1]*1LL);
    }
    if(n_cnt%2==1){
        sum+=((zero) ? 0 : v[n_cnt-1]);
    }
    cout<<sum;

    } else {

    for(int i=N-1; i>N-p_cnt; i-=2){
        sum+=max((v[i]*v[i-1]*1LL), (v[i]+v[i-1]));
    }
    if(p_cnt%2==1){
        sum+=v[N-p_cnt];
    }

    for(int i=0; i<n_cnt-1; i+=2){
        sum+=(v[i]*v[i+1]*1LL);
    }
    if(n_cnt%2==1){
        sum+=((zero) ? 0 : v[n_cnt-1]);
    }


    cout<<sum;
  }



}

 

하나의 벡터 내에서 정렬한 후, 개수를 기준으로 인덱스를 나누어 0에 대한 예외처리, 1에 대한 예외처리를 모두 한경우.

풀이가 오래 걸렸던 이유는 0의 존재 때문이었다. 0은 존재 유무만 판단하면 되는데 말이다.(음수 나머지 하나 상쇄)