백준 1744번 - 수 묶기

박진형·2021년 6월 25일
0

algorithm

목록 보기
21/111
post-custom-banner

문제 풀이

먼저 입력을 양수, 음수 각각 따로 벡터에 저장을하고 0입력의 개수는 따로 변수에 저장한다.

그리고 음수는 내림차순으로 정렬, 양수는 오름차순으로 정렬한다.
정렬했으므로 양수는 큰수부터 두개씩 묶어서 곱하면되는데, 1과 2같은 경우에는 더하는게 더 값이 크므로 더한값과 곱한값을 비교해서 더큰 값을 ans에 더해준다.
이후 양수의 개수가 홀수라면 하나가 남으니까 남는것을 ans에 더해준다.

이제 음수는 가장 작은것 두개를 곱해주면 가장 큰 양수가 되므로 작은것부터 두개씩 곱해주고 pop연산을 해서 빼준다.
두개씩 묶어 가장 큰 수를 만들어주고 난 후 입력 수열중에 0이 있고 neg가 비어있지 않다면 그 수는 0과 묶어 (0 n) 으로 0을 만들어줄 수 있으니까 pop해준다.
ex) {-1, -2, -3, 0} -> (-2
-3) + (-1 * 0) = 6

입력 수열 중에 0이 없다면 남은것을 그냥 ans에 더해주면 된다.
ex) {-1, -2, -3} -> (-3 * -2) + (-1) = 5

문제 링크

boj/1744

소스코드

PS/1744.cpp

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;

vector<int> p;
vector<int> neg;
int zero;
int main(void)
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int a;
		cin >> a;
		if (a > 0)
			p.push_back(a);
		else if (a == 0)
			zero++;
		else
			neg.push_back(a);
	}
	
	sort(neg.begin(), neg.end(),greater<int>());
	sort(p.begin(), p.end());
	int ans = 0;

	for (int i = p.size() - 1; i >= 1; i -= 2)
	{
		if(p[i] + p[i-1] > p[i] * p[i-1])
			ans += p[i] + p[i - 1];
		else
			ans += p[i] * p[i - 1];
	}
	if (p.size() % 2 == 1)
		ans += p[0];
	for (int i = neg.size() -1; i >=1; i -= 2)
	{
		ans += neg[i] * neg[i-1];
		neg.pop_back();
		neg.pop_back();
	}
	if (!neg.empty() && zero)
		neg.pop_back();
	else if (!neg.empty() && !zero)
		ans += neg[0];
	cout << ans;
}
post-custom-banner

0개의 댓글