BOJ 1744 : 수 묶기 - C++

김정욱·2021년 2월 18일
0

Algorithm - 문제

목록 보기
112/249
post-custom-banner

수 묶기

코드

#include <string>
#include <vector>
#include <iostream>
#include <cmath>
#include <map>
#include <algorithm>
#include <sstream>
using namespace std;

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

    int N,sum=0, in;
    cin >> N;
    vector<int> plus;
    vector<int> minus;
    for(int i=0;i<N;i++) {
        cin >> in;
        /* 0은 음수쪽에 넣어야된다 --> 합이 최대여야하니까 곱해서 없앨 수 있음 */
        if(in > 0) plus.push_back(in);
        else minus.push_back(in);
    }
    sort(plus.begin(),plus.end(),greater<int>());
    sort(minus.begin(),minus.end(),less<int>());
    int i=0;
    if(!plus.empty()){
        for(;i<plus.size()-1;i+=2){
            if(plus[i] == 1 || plus[i+1] == 1) sum += plus[i] + plus[i+1];
            else sum += plus[i]*plus[i+1];
        }
        if(i < plus.size()) sum+=plus[i];
    }
    int j=0;
    if(!minus.empty()){
        for(;j<minus.size()-1;j+=2)
            sum += minus[j]*minus[j+1];
        if(j < minus.size()) sum+=minus[j];
    }
    cout << sum;
    return 0;
}
// 1. 벡터 선언 후 안건드리고 v.size()하면 오류나는거 기록
// 2. 0일때는 반드시 음수로 처리해야하는것
// 3. 곱셈이기 때문에 하나라도 1이면 더하는게 이득임ㅠㅠㅠㅠㅠㅠ
  • 깨달음
    1) 컨테이너 선언 후에 값을 추가하지 않고 v.size()하면 오류난다 ㅠㅠㅠ
    2) 곱셈 / 음수 이 두가지가 있을 때에는 반드시 0과 1처리에 대해 고민하자
  • 로직
    1) 수를 음수/양수로 분리해서 받는다
    (0은 음수로넣어야함 --> 음수와 곱해서 없어질 수 있기 때문에!)
    2) 양수는 내림차순 / 음수는 오름차순으로 정렬 (음수는 작은수의 곱이 더 크기 때문)
    3) 양수처리를 할 때 2개의 수 중 하나라도 1이면 더하는게 이득임!
profile
Developer & PhotoGrapher
post-custom-banner

0개의 댓글