수를 크기 순으로 정렬하고, 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은 존재 유무만 판단하면 되는데 말이다.(음수 나머지 하나 상쇄)

'알고리즘' 카테고리의 다른 글
| Boj 1012 c++ 유기농 배추(feat: 연결 요소의 개수) (0) | 2025.06.03 |
|---|---|
| Boj 1620 c++ 나는야 포켓몬 마스터 이다솜 (0) | 2025.06.03 |
| Boj 30960 c++ 눈물의 조별과제 (0) | 2025.06.03 |
| Boj 21758 c++ 꿀따기 (0) | 2025.06.03 |
| Boj 31964 c++ 반품회수 (0) | 2025.06.02 |