어렵지 않은 문제였다.
OutOfBoundsException만 처리해준다면, 어려울것이 없는문제.
잠깐 코드 일부분을 봐보자.
plus.size()>0
이것을 왜썻을까? 이생각을 해야한다. 만약 plus.size()>0이 없다면, plus vector의 크기가 0인상태에도 0%2==0이 참이므로 if문이 실행될것이다.
그러므로, plus[0]*plus[1]이라는 할당되지 않은 index로 접근을 하는 오류가 발생한다.
=>이때 OutOfBoundException이 발생한다.
그러므로 이 오류를 피하기 위해서 항상 vector에 접근할때는, 지금 vector의 size가 얼마지? 라는 생각을 해야한다.
이제 알고리즘 로직은 이렇다.
경우의 수를 나눠보자면,
음수가 짝수인경우 =>전부 묶으면됨
음수가 홀수인경우
2.1) zero가 있는경우 마지막 한개의 음수를 안더해줘도됨=>왜냐면 0과 묶으면 사라지니까
2.2) zero가 없는경우 마지막 한개의 음수를 더해줌
양수의 경우에는 1이상의 수만 vector에 넣었다. 왜? 1은 곱하는것보다 더하는게 이득이니까.
3.1) 양수가 짝수개있는경우=>전부 묶으면됨
3.2) 양수가 홀수개 있는경우=>마지막 하나빼고 다묶고 하나만 더해주면됨
코드
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int main() {
int a = 0;
cin >> a;
vector<int> minus;
vector<int> plus;
int zerocnt = 0;
int one = 0;
for (int i = 0; i < a; i++) {
int tmp;
cin >> tmp;
if (tmp > 0 && tmp !=1) plus.push_back(tmp);
if (tmp == 1) one++;
if (tmp < 0) minus.push_back(tmp);
if (tmp == 0) zerocnt++;
}
sort(plus.begin(), plus.end(), greater<>());
sort(minus.begin(), minus.end());
int answer = 0;
//minus가 있고, 짝수개있는경우
if (minus.size()>0 && minus.size() % 2 == 0) {
for (int i = 0; i < minus.size() - 1; i++) {
answer += (minus[i] * minus[i + 1]);
i++;
}
}//minus가 있는데 홀수개있는경우
else if(minus.size()>0){
queue<int>m;
for (int i = 0; i < minus.size(); i++) {
m.push(minus[i]);
}
//zerocnt가 있는경우
if (zerocnt > 0 && m.size()>=3) {
while (m.size() > 1) {
int x = m.front();
m.pop();
int y = m.front();
m.pop();
answer += x * y;
}
}
//zrocnt가 없는경우
//그중에 minus가 3개이상있는경우
if (zerocnt == 0 && m.size() >= 3) {
while (m.size() > 1) {
int x = m.front();
m.pop();
int y = m.front();
m.pop();
answer += x * y;
}
answer += m.front();
//minus가 1개있는경우
}else if (zerocnt == 0 && m.size() == 1) {
answer += m.front();
}
}
//plus가 있는데 짝수개있는경우
if (plus.size()>0 && plus.size() % 2 == 0) {
for (int i = 0; i < plus.size() - 1; i++) {
answer += (plus[i] * plus[i + 1]);
i++;
}
}//plus가 있는데 홀수개 있는경우
else if(plus.size()>0){//그중에서 size()가 3이상인경우
if (plus.size() >= 3) {
for (int i = 0; i < plus.size() - 2; i++) {
answer += (plus[i] * plus[i + 1]);
i++;
}//size가 1인경우
answer += plus[plus.size() - 1];
}
else if (plus.size() == 1) {
answer += plus[0];
}
}
cout << answer+one;
}