끄적끄적 코딩
article thumbnail
Published 2021. 8. 4. 20:43
[C++] 백준 1744번 수 묶기 알고리즘

두개의 수를 묶거나 그대로 두어서 최대한 높은값을 만드는 문제입니다.

-배열에 값이 없을때 까지 반복-

1. 양수가 2개 이상인 경우 - 가장 높은 수 두개 곱해서 결과값에 더함
2. 양수가 1개인 경우 - 해당 값을 결과값에 더함
3. 0이 있는 경우 - zero를 true로 변경 (0이 있다는 것을 표현)
3. 음수가 2개 이상인 경우 - 가장 낮은 수 두개 곱해서 결과값에 더함
4. 음수가 1개인 경우
  4-1) 0이 있는 경우 - 해당 값 제거
  4-2) 0이 없는 경우 - 해당 값 결과값에 더함
(계산된 값들은 배열에서 제거)

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

bool asc_sort(int a, int b)
{
	return a > b;	
}

int main(int argc, char *argv[])
{
	int n;
	int num;
	int result = 0;
	bool zero = false;
	vector<int> v;
	
	cin >> n;
	
	for(int i=0; i<n; ++i) {
		cin >> num;
		v.push_back(num);
	}
	
	sort(v.begin(), v.end(), asc_sort);
	
	while(1){
		if(v[0] > 0){
			if(v.size() > 1){
				if(v[1] > 1){
					result += v[0] * v[1]	;
					v.erase(v.begin());
					v.erase(v.begin());
				} else if (v[1] == 1){
					result += v[0] + 1;	
					v.erase(v.begin());
					v.erase(v.begin());
				} else if (v[1] == 0) {
					result += v[0];	
					v.erase(v.begin());
					v.erase(v.begin());
					zero = true;
				} else  {
					result += v[0];	
					v.erase(v.begin());
				}
			} 
			else {
				result += v[0];
				v.erase(v.begin());
			}
		} else if(v[0] == 0){
			v.erase(v.begin());
			zero = true;
		} else {
			sort(v.begin(), v.end());
			if(v.size() > 1){
				result += v[0] * v[1];
				v.erase(v.begin());
				v.erase(v.begin());
			} else {
				if(zero){
					v.erase(v.begin());	
				} else {
					result += v[0];
					v.erase(v.begin());
				}
			}
		}
		if(v.size() == 0){
		  break;
	  }
	}
	
	cout << result << endl;
	
	return 0;
}

 

검색 태그