문제 : https://www.acmicpc.net/problem/1744
그리디 Greedy
그리디 기법을 이용해서 문제를 해결할 수 있습니다.
● 입력을 양수와 음수, 0 으로 구분합니다.
● 양수는 큰 수부터 차례대로 2개씩 묶어서 곱해서 더해주면 됩니다. 이때, 2개씩 묶는데 1이 포함되어있다면 곱하는 것보다 그냥 더하는게 최대값이므로 따로 처리해줍니다.
● 음수는 절대값이 큰 수부터 차례대로 2개씩 묶어서 곱해서 더해주면 양수를 만들 수 있습니다.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(int a, int b) {
if (a < b)
return false;
return true;
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int N, x;
vector<int> plus, minus;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> x;
if (x > 0) plus.push_back(x);
else minus.push_back(x);
}
sort(minus.begin(), minus.end(), cmp);
sort(plus.begin(), plus.end());
int ans = 0;
while (!plus.empty()) {
if (plus.size() >= 2) {
if (plus[plus.size() - 1] == 1 || plus[plus.size() - 2] == 1)
ans += plus[plus.size() - 1] + plus[plus.size() - 2];
else
ans += plus[plus.size() - 1] * plus[plus.size() - 2];
plus.pop_back();
}
else
ans += plus[plus.size() - 1];
plus.pop_back();
}
while (!minus.empty()) {
if (minus.size() >= 2) {
ans += minus[minus.size() - 1] * minus[minus.size() - 2];
minus.pop_back();
}
else
ans += minus[minus.size() - 1];
minus.pop_back();
}
cout << ans;
return 0;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 1799 : 비숍 (0) | 2020.05.06 |
---|---|
[BOJ] 9370 : Destination Unknown (0) | 2020.04.29 |
[BOJ] 5670 : Cellphone Typing (0) | 2020.04.23 |
[BOJ] 5052 : Phone List (0) | 2020.04.22 |
[BOJ] 2458 : 키 순서 - travelbeeee (0) | 2020.04.14 |