https://www.acmicpc.net/problem/1744
10
-5
-4
-3
-2
-1
0
1
2
3
4
정답 : 41
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
vector<int> arr;
int input=0;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> input;
arr.push_back(input);
}
sort(arr.begin(), arr.end());
int sum = 0;
int negativeIndex = n-1;
int i = 0;
for (i = n-1; i >=0; i--) { //큰 양수들끼리 묶어주기
if (arr[i] > 0) {
if (i > 0) {
if (arr[i - 1] <= 1) sum += arr[i]; //1은 더해주는게 이득
else {
sum += arr[i]*arr[i - 1];
i--;
}
}
else sum += arr[i];
}
else { //음수나 0이 나오면 종료
break;
}
}
negativeIndex = i+1; //반대쪽부터 여기까지 음수 반복문 돌릴거임
for (i = 0; i < negativeIndex; i++) { //작은 음수들끼리 묶어주기
if (i < negativeIndex - 1) {
sum += arr[i] * arr[i + 1];
i++;
}
else sum += arr[i];
}
cout << sum << "\n";
}
https://suhwanc.tistory.com/18
아예 양수와 음수 배열을 다르게 두고 각각에 대해 반복문을 쓰고,
1의 개수만 마지막에 따로 더해주는 방식을 썼다. (설명이 뭔가 웃겼음)
결론적으로 반복문을 2개 사용한다는 점에서, 효율성은 동일하다.
하지만, 묶어주는 과정을 깔끔하게 짤 수 있었다.
더 효율적인 방법인 것 같다.