[C/C++] BOJ(백준) 1744 "수 묶기" 문제 풀이 & 소스 코드

반응형
반응형

#문제정보

출처 : www.acmicpc.net/problem/1744

난이도 : 골드4

분류 : 그리디(GREEDY) 알고리즘

 

#문제분석

입력받은 수들을 양수,음수,0 으로 각각 다른 벡터에 저장해서 풀이했습니다.

vector<int> pos; // 양수 벡터
vector<int> neg; // 음수 벡터
vector<int> zero; // 0 저장 벡터
vector<int> res; // 출력 값 

 

 

CASE1 : 양수벡터

양수가 홀수개인 경우 : 가장 작은 값을 결과값에 더합니다.

양수가 짝수개인 경우 : 양수벡터를 오름차 정렬한 후 , 뒤에서 부터 2개씩 묶어 곱한 뒤 결과값에 더합니다.

(내림차 정렬한 후 앞에서 부터 2개씩 곱해도 상관은 없습니다.)

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

 

CASE2 : 음수벡터

음수가 홀수개 & 0이 포함된 경우 : 가장 큰값 |절댓값이 가장 작은값| 과 0을 곱합니다.

음수가 홀수개 & 0이 포함되지 않은 경우 : 가장 큰값 |절댓값이 가장 작은값|을 결과값에 더합니다.

음수가 짝수개인 경우 : 음수벡터를 오름차 정렬한 후 , 앞에서 부터 2개씩 묶어 곱한 뒤 결과값에 더합니다.

// negative
	int nSize = neg.size();
	if (nSize % 2 != 0)
	{
		if (zero.size() > 0)
		{
			zero.pop_back();
		}
		
		else
		{
			res.push_back(neg[nSize - 1]);
		}
	}
	
	for (int i = 0 ; i < nSize - 1 ; i+=2)
	{
		res.push_back(neg[i] * neg[i+1]);
	}

 

#소스코드

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

vector<int> pos; // 양수 벡터
vector<int> neg; // 음수 벡터
vector<int> zero; // 0 저장 벡터
vector<int> res; // 출력 값 

int main()
{
	int n;
	cin >> n;
	int tmp;
	for (int i = 0 ; i < n ; i++)
	{
		cin >> tmp;
		if (tmp > 0)
		{
			if (tmp == 1){
				res.push_back(tmp);
			}
			else{
				pos.push_back(tmp);
			}
		}
		
		else if (tmp < 0)
		{
			neg.push_back(tmp);
		}
		
		else
		{
			zero.push_back(tmp);
		}
	} 
	
	sort(pos.begin(), pos.end());
	sort(neg.begin(), neg.end());
	
	// positive 
	int pSize = pos.size();
	if (pSize % 2 != 0)
	{
		res.push_back(pos[0]);
	}
	
	for (int i = pSize - 1 ; i > 0 ; i-=2)
	{
		res.push_back(pos[i] * pos[i - 1]);
	}
	
	// negative
	int nSize = neg.size();
	if (nSize % 2 != 0)
	{
		if (zero.size() > 0)
		{
			zero.pop_back();
		}
		
		else
		{
			res.push_back(neg[nSize - 1]);
		}
	}
	
	for (int i = 0 ; i < nSize - 1 ; i+=2)
	{
		res.push_back(neg[i] * neg[i+1]);
	}
	
	int sum = 0;
	for (int i = 0 ; i < res.size(); i++)
	{
		sum += res[i];
	}
	
	cout << sum;
	
	return 0; 
}
반응형

댓글

Designed by JB FACTORY