알고리즘

C++ 알고리즘 - 2156 포도주 시식

마루설아 2025. 1. 24. 20:33

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

 

#include <bits/stdc++.h>
#define endl "\n"

using namespace std;

/******** 전역변수 ********/


/******** 함    수 ********/


int main(void) {
	/******** C++ INIT ********/
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	/******** 지역변수 ********/
	int input1;
	int input2;
	vector<int> v;
	vector<int> v2;

	/******** 구    현 ********/
	cin >> input1;

	for (int i = 0; i < input1; i++) {
		cin >> input2;
		v.push_back(input2);
	}
	
	// 점화식 : 1번 포도주
	v2.push_back(v[0]);
	if (input1 == 1) {
		cout << *max_element(v2.begin(), v2.end());
		return 0;
	}

	// 점화식 : 2번 포도주 = 1번+2번
	v2.push_back(v[0] + v[1]);
	if (input1 == 2) {
		cout << *max_element(v2.begin(), v2.end());
		return 0;
	}

	// 점화식 : 3번 포도주 = 1번+3번 / 2번+3번 중 최대값
	v2.push_back(max(v[0] + v[2], v[1] + v[2]));
	if (input1 == 3) {
		cout << *max_element(v2.begin(), v2.end());
		return 0;
	}

	// 점화식 : 4번 포도주 = 1번+2번+4번 / 1번+3번+4번 중 최대값
	v2.push_back(max(v[0] + v[1] + v[3], v[0]+ v[2] + v[3]));
	if (input1 == 4) {
		cout << *max_element(v2.begin(), v2.end());
		return 0;
	}

	// 5번부터 최대 포도주 값 계산
	for (int i = 4; i < v.size(); i++) {
		// 현재 포도주 + 바로 뒤 포도주 + 뒤쪽 3번째 포도주의 최대값
		// 현재 포도주 + 뒤쪽 2번째 포도주의 최댁밧
		// 현재 포도주 + 바로 뒤 포도주 + 뒤쪽 4번째 포도주의 최대값
		// 위 3가지 값 중 최대값을 벡터에 삽입
		v2.push_back(
			max(
				max(v[i] + v[i - 1] + v2[i - 3], v[i] + v2[i - 2])
				,v[i] + v[i - 1] + v2[i - 4])
		);
	}

	// 벡터 내 가장 큰 값 : 최대로 마실 수 있는 포도주량
	cout << *max_element(v2.begin(), v2.end());
}