문제
https://www.acmicpc.net/problem/1744
1744번: 수 묶기
길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에
www.acmicpc.net
풀이
- 가능한 한 큰 수들끼리 묶어야 결괏값이 커진다.
- 음수끼리 곱하면 양수로 변한다.
그리디(Greedy) 알고리즘
그리디(Greedy) 알고리즘 현재 상태에서 볼 수 있는 선택지 중에 최선의 선택을 하는 알고리즘 + 구현하기 쉽다. + 시간 복잡도가 우수하다. - 항상 최적의 해를 보장하지 못한다. 그리디 알고리즘
soobin0821.tistory.com
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
vector<int> plus;
vector<int> minus;
int zero = 0;
int num;
for(int i = 0; i < N; i++)
{
cin >> num;
if(num == 0)
{
zero++;
}
else if(num > 0)
{
plus.push_back(num);
}
else
{
minus.push_back(-num);
}
}
sort(plus.begin(), plus.end());
sort(minus.begin(), minus.end());
int result = 0;
int start_index = 0;
if(plus.size() % 2 == 1)
{
result += plus[0];
start_index = 1;
}
for(int i = plus.size() - 1; i >= start_index; i = i - 2)
{
result = result + max((plus[i] * plus[i - 1]), plus[i] + plus[i - 1]);
}
if(minus.size() % 2 == 1)
{
if(zero <= 0)
{
result -= minus[0];
start_index = 1;
}
}
for(int i = minus.size() - 1; i >= start_index; i = i - 2)
{
result += (minus[i] * minus[i - 1]);
}
cout << result;
return 0;
}
728x90
'코딩테스트 > 백준' 카테고리의 다른 글
[백준][C++]1929번 소수 구하기 (0) | 2023.06.15 |
---|---|
[백준][C++]1167번 트리의 지름 (0) | 2023.06.14 |
[백준][C++]1541번 잃어버린 괄호 (0) | 2023.06.09 |
[백준][C++]1463번 1로 만들기 (0) | 2023.06.09 |
[백준][C++]1325번 효율적인 해킹 (0) | 2023.06.08 |