본문 바로가기
백준 코딩테스트/골드

1744) 수 묶기 (C++)

by xortl98 2022. 4. 16.
728x90

 

 출처 

https://www.acmicpc.net/problem/1744

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net

 내 풀이 

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

vector<int> plus_numbers;
vector<int> minus_numbers;

int N = 0;
int numbers = 0;
int result = 0;

int main()
{
	cin >> N;

	//음수는 음수끼리, 양수는 양수끼리 분리 1은 그냥 더해줌  
	for (int i = 0; i < N; i++)
	{
		cin >> numbers;

		if (numbers <= 0)
		{
			minus_numbers.push_back(numbers);
		}
		else if (numbers > 1)
		{
			plus_numbers.push_back(numbers);
		}
		else if (numbers == 1)
		{
			result += numbers;
		}
	}

	sort(plus_numbers.begin(), plus_numbers.end(), greater<int>());
	sort(minus_numbers.begin(), minus_numbers.end());


	//만일 짝수가 아니라면 맨 끝값은 더해줌 (어차피 곱할 수 없으니)
	if (plus_numbers.size() % 2 != 0)	result += plus_numbers[plus_numbers.size() - 1];
	if (minus_numbers.size() % 2 != 0)	result += minus_numbers[minus_numbers.size() - 1];

	int first = 0;
	int second = 0;
	for (int i = 0; i < plus_numbers.size(); i++)
	{
		if (!first)
		{
			first = plus_numbers[i];
		}
		else if (!second)
		{
			second = plus_numbers[i];
			result += first * second;
			first = 0, second = 0;
		}
	}

	//다시 초기화 
	first = 0;
	second = 0;

	for (int i = 0; i < minus_numbers.size(); i++)
	{
		if (!first)
		{
			first = minus_numbers[i];
		}
		else if (!second)
		{
			second = minus_numbers[i];
			result += first * second;
			first = 0, second = 0;
		}
	}

	cout << result;
}

 

 해설

일단 입력받는 숫자 중 양수 음수를 나눠서 각 벡터에 넣어주었다. 그리고 1같은 경우는 더하는게 더 큰수가 나오므로 더해주었다. 그리고 양수와 음수로 나눈 벡터를 정렬 후 양값을 곱해서 결과값에 더해주었다. 벡터가 홀수일 경우 가장 작은 마지막 값은 그 전에 더해주었다.

 

1. 마이너스일 경우 마이너스끼리 곱하면 양수가 된다.
2. 1일경우 그냥 더해주는게 더 크다.
3. 1 이상인 경우 곱해주는게 좋다.

 새로 안 것 

화이팅