두개의 수를 묶거나 그대로 두어서 최대한 높은값을 만드는 문제입니다.
-배열에 값이 없을때 까지 반복-
1. 양수가 2개 이상인 경우 - 가장 높은 수 두개 곱해서 결과값에 더함
2. 양수가 1개인 경우 - 해당 값을 결과값에 더함
3. 0이 있는 경우 - zero를 true로 변경 (0이 있다는 것을 표현)
3. 음수가 2개 이상인 경우 - 가장 낮은 수 두개 곱해서 결과값에 더함
4. 음수가 1개인 경우
4-1) 0이 있는 경우 - 해당 값 제거
4-2) 0이 없는 경우 - 해당 값 결과값에 더함
(계산된 값들은 배열에서 제거)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool asc_sort(int a, int b)
{
return a > b;
}
int main(int argc, char *argv[])
{
int n;
int num;
int result = 0;
bool zero = false;
vector<int> v;
cin >> n;
for(int i=0; i<n; ++i) {
cin >> num;
v.push_back(num);
}
sort(v.begin(), v.end(), asc_sort);
while(1){
if(v[0] > 0){
if(v.size() > 1){
if(v[1] > 1){
result += v[0] * v[1] ;
v.erase(v.begin());
v.erase(v.begin());
} else if (v[1] == 1){
result += v[0] + 1;
v.erase(v.begin());
v.erase(v.begin());
} else if (v[1] == 0) {
result += v[0];
v.erase(v.begin());
v.erase(v.begin());
zero = true;
} else {
result += v[0];
v.erase(v.begin());
}
}
else {
result += v[0];
v.erase(v.begin());
}
} else if(v[0] == 0){
v.erase(v.begin());
zero = true;
} else {
sort(v.begin(), v.end());
if(v.size() > 1){
result += v[0] * v[1];
v.erase(v.begin());
v.erase(v.begin());
} else {
if(zero){
v.erase(v.begin());
} else {
result += v[0];
v.erase(v.begin());
}
}
}
if(v.size() == 0){
break;
}
}
cout << result << endl;
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 1715번 카드 정렬하기 (0) | 2021.08.09 |
---|---|
[C++] 백준 1339번 단어 수학 (0) | 2021.08.09 |
[C++] 백준 4358번 생태학 (0) | 2021.08.04 |
[C++] 프로그래머스 - 압축 (0) | 2021.05.26 |
[C++] 프로그래머스 - N진수 게임 (0) | 2021.05.18 |