https://www.acmicpc.net/problem/1744
1은 더했을 때 최대이니 1은 따로 빼서 sum,
양수/음수를 나눠 곱해주고 홀수라면 남은 하나는 더하기. 처음에는 arr을 사용했는데 굳이 배열을 쓰지 않아도 가능
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int N;
cin >> N;
long long plus[51], minus[51], arr[51];
for(int i=0; i<N; i++){
cin >> arr[i];
}
sort(arr, arr+N);
long long sum = 0;
int p = 0, m = 0;
// 양수, 1, 음수 분리
for(int i=0; i<N; i++){
if(arr[i] > 1){
plus[p++] = arr[i];
}else if (arr[i] == 1){
sum += 1;
}else{
minus[m++] = arr[i];
}
}
// 양수 큰 수부터 곱하기
for(int i=p-1; i>=1; i-=2){
sum += plus[i] * plus[i-1];
}
if(p % 2 == 1){
sum += plus[0];
}
// 음수 작은 수부터 곱하기
for(int i=0; i<m-1; i+=2){
sum += minus[i] * minus[i+1];
}
if(m % 2 == 1){
sum += minus[m-1];
}
cout << sum;
}
vector 사용해서도 해봤는데 런타임 에러가 계속 나서 보니 언더플로우 문제가 있었다!!!!!!!!! 배운 걸 다 까먹은듯
for(int i=0; i<p.size()-1; i+=2)
p.size()가 0일 때 p.size()는 size_t (unsigned)이므로
0 - 1 하면 음수가 아니라 → 1844674407... 같은 큰 양수가 됨
이렇게 되면 i < p.size()-1 이 항상 true가 되어 루프 돎!!!
조건을 for(int i = 0; i + 1 < p.size(); i += 2) 로 바꿔주자.
올바른 vector 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
ios::sync_with_stdio(0); cin.tie(0);
int N; cin >> N;
vector<int> p, m;
int sum = 0;
for(int i=0; i<N; i++){
int x; cin >> x;
if(x > 1) p.push_back(x);
else if(x == 1) sum += 1;
else m.push_back(x);
}
sort(p.begin(), p.end(), greater<>()); // 양수는 내림차순
sort(m.begin(), m.end()); // 음수는 오름차순
if(p.size() % 2 == 1) sum += p.back();
for(int i = 0; i + 1 < p.size(); i += 2){
sum += p[i] * p[i+1];
}
if(m.size() % 2 == 1) sum += m.back();
for(int i = 0; i + 1 < m.size(); i += 2){
sum += m[i] * m[i+1];
}
cout << sum;
return 0;
}'백준' 카테고리의 다른 글
| [백준 1751 C++] 카드 정렬하기 풀이(그리디, 우선순위 큐) (0) | 2026.02.16 |
|---|---|
| [백준 2751 c++] 수 정렬하기 2 런타임 에러, 시간초과 해결 (0) | 2026.01.03 |
| [백준 2839번 C++] 설탕 배달 (0) | 2025.05.07 |
| [백준 1874번 C++] 스택 수열 (0) | 2025.05.06 |