백준/골드
[백준 1744번] 수 묶기 (C++)
게임개발기원
2025. 3. 22. 05:43
문제링크 : https://www.acmicpc.net/problem/1744
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int N;
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N;
vector<int>vp, vm;
for(int i=0; i<N; i++)
{
int num;
cin >> num;
if(num > 0) vp.push_back(num);
else vm.push_back(num);
}
sort(vp.begin(), vp.end(), greater<>());
sort(vm.begin(), vm.end());
int result = 0;
for(int i=0; i+1<vp.size(); i+=2) //2쌍씩 체크
{
if(vp[i]==1 || vp[i+1] == 1) result += vp[i] + vp[i+1];
else result += vp[i]*vp[i+1];
}
if(vp.size()%2!=0) result += vp.back(); //남은 수 더해주기
for(int i=0; i+1<vm.size(); i+=2) //음수도 동일하게 체크
{
result += vm[i] * vm[i+1];
}
if(vm.size()%2!=0) result += vm.back();
cout << result;
return 0;
}
입력받은 수가 음수도 존재하기에, 음수와 양수를 따로 벡터에 담아준다.
이를 각각 정렬을 통해 가장 큰 값을 곱하도록 배치해준다.
덧셈의 경우에는 묶는 쌍에 1이 존재하면 더하는 것이 이득이기에, 이를 주의하고 나머지 경우에만 곱해준다.
그리고 각 입력받은 음수와 양수가 홀수 일경우 남은 수가 존재하기에, 이를 체크하여 더해준다.
반복문에서는 쌍을 검토하므로 i+=2해주고, 조건을 i+1<vp.size()를 해야한다.
처음에는 별 생각없이 i<vp.size()-1;로 주었으나, vp.size()==1인 경우에는 반복문 조건을 통과해 실행을 하게 되는데,
입력받은 수가 1개밖에 없어 vp[0]에만 값이 있다. 하지만 값이 없는 vp[1]에도 접근하여 OutOfBounds 오류가 발생한다.