수묶기--c++

고동현·2024년 3월 6일
0

PS

목록 보기
3/51

어렵지 않은 문제였다.
OutOfBoundsException만 처리해준다면, 어려울것이 없는문제.
잠깐 코드 일부분을 봐보자.

plus.size()>0
이것을 왜썻을까? 이생각을 해야한다. 만약 plus.size()>0이 없다면, plus vector의 크기가 0인상태에도 0%2==0이 참이므로 if문이 실행될것이다.
그러므로, plus[0]*plus[1]이라는 할당되지 않은 index로 접근을 하는 오류가 발생한다.
=>이때 OutOfBoundException이 발생한다.
그러므로 이 오류를 피하기 위해서 항상 vector에 접근할때는, 지금 vector의 size가 얼마지? 라는 생각을 해야한다.

이제 알고리즘 로직은 이렇다.
경우의 수를 나눠보자면,

  1. 음수가 짝수인경우 =>전부 묶으면됨

  2. 음수가 홀수인경우
    2.1) zero가 있는경우 마지막 한개의 음수를 안더해줘도됨=>왜냐면 0과 묶으면 사라지니까
    2.2) zero가 없는경우 마지막 한개의 음수를 더해줌

  3. 양수의 경우에는 1이상의 수만 vector에 넣었다. 왜? 1은 곱하는것보다 더하는게 이득이니까.
    3.1) 양수가 짝수개있는경우=>전부 묶으면됨
    3.2) 양수가 홀수개 있는경우=>마지막 하나빼고 다묶고 하나만 더해주면됨

코드

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

int main() {
	int a = 0;
	cin >> a;
	vector<int> minus;
	vector<int> plus;
	int zerocnt = 0;
	int one = 0;
	for (int i = 0; i < a; i++) {
		int tmp;
		cin >> tmp;
		if (tmp > 0 && tmp !=1) plus.push_back(tmp);
		if (tmp == 1) one++;
		if (tmp < 0) minus.push_back(tmp);
		if (tmp == 0) zerocnt++;
	}

	sort(plus.begin(), plus.end(), greater<>());
	sort(minus.begin(), minus.end());

	int answer = 0;

	//minus가 있고, 짝수개있는경우
	if (minus.size()>0 && minus.size() % 2 == 0) {
		for (int i = 0; i < minus.size() - 1; i++) {
			answer += (minus[i] * minus[i + 1]);
			i++;
		}
	}//minus가 있는데 홀수개있는경우
	else if(minus.size()>0){
		queue<int>m;
		for (int i = 0; i < minus.size(); i++) {
			m.push(minus[i]);
		}
		//zerocnt가 있는경우
		if (zerocnt > 0 && m.size()>=3) {
			while (m.size() > 1) {
				int x = m.front();
				m.pop();
				int y = m.front();
				m.pop();
				answer += x * y;
			}
		}

		//zrocnt가 없는경우
		//그중에 minus가 3개이상있는경우
		if (zerocnt == 0 && m.size() >= 3) {
			while (m.size() > 1) {
				int x = m.front();
				m.pop();
				int y = m.front();
				m.pop();
				answer += x * y;
			}
			answer += m.front();
			//minus가 1개있는경우
		}else if (zerocnt == 0 && m.size() == 1) {
			answer += m.front();
		}
	}

	//plus가 있는데 짝수개있는경우
	if (plus.size()>0 && plus.size() % 2 == 0) {
		for (int i = 0; i < plus.size() - 1; i++) {
			answer += (plus[i] * plus[i + 1]);
			i++;
		}
	}//plus가 있는데 홀수개 있는경우
	else if(plus.size()>0){//그중에서 size()가 3이상인경우
		if (plus.size() >= 3) {
			for (int i = 0; i < plus.size() - 2; i++) {
				answer += (plus[i] * plus[i + 1]);
				i++;
			}//size가 1인경우
			answer += plus[plus.size() - 1];
		}
		else if (plus.size() == 1) {
			answer += plus[0];
		}
	}

	cout << answer+one;
}
profile
항상 Why?[왜썻는지] What?[이를 통해 무엇을 얻었는지 생각하겠습니다.]

0개의 댓글