Little Jay

[C++] 백준 1744번 - 수 묶기 본문

알고리즘/BOJ

[C++] 백준 1744번 - 수 묶기

Jay, Lee 2022. 2. 11. 19:49

너무 어렵게 접근했던 문제이다.

뇌가 처음에는 너무 꼬여서 양수만 있을때, 음수있을때, 음수랑 0만 있을때, 0과 양수만 있을때 

하나의 vector 컨테이너에서 조건문을 10개 이상 만들면서 처리를 하려고 했다.

 

너무 복잡해지자 이걸 어떻게 효율적으로 처리할까 고민하다가

양수와 음수를 따로 받는 방법을 생각하게 되었다.

 

1은 수를 묶을때 의미가 없다. 예를 들어

1 + 3 은 1 * 3 보다 무조건 크기 때문에 1이 들어올때는 바로 결과물을 담는 컨테이너에 담아주면 된다.

양수와 음수는 서로 묶어주지만 각 벡터의 개수가 홀수인지, 양수인지 구분해주면 된다. 

 

#include <iostream>
#include <vector>
#include <algorithm>
#define endl '\n'
using namespace std;

int n, cumsum;
vector<int> pos;
vector<int> neg;
vector<int> zeros;
vector<int> ans;

int main() {

	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	cin >> n;
	while (n--) {
		int num; cin >> num;
		if (num < 0) neg.push_back(num);
		else if (num == 0) zeros.push_back(num);
		else {
			if (num == 1) ans.push_back(num);
			else pos.push_back(num);
		}
	}

	sort(pos.begin(), pos.end());
	sort(neg.begin(), neg.end());

	if (pos.size() % 2 != 0) {
		ans.push_back(pos[0]);
	}
	for (int i = pos.size() - 1; i > 0; i -= 2) {
		ans.push_back(pos[i] * pos[i - 1]);
	}

	if (neg.size() % 2 != 0) {
		if (zeros.size()) {
			zeros.pop_back();
		}
		else {
			ans.push_back(neg[neg.size() - 1]);
		}
	}

	for (int i = 0; i < static_cast<int>(neg.size() - 1); i += 2) {
		ans.push_back(neg[i] * neg[i + 1]);
	}
	
	for (int i = 0; i < ans.size(); i++) {
		cumsum += ans[i];
	}
	cout << cumsum << endl;

	return 0;
}
Comments