알고리즘

C++ 알고리즘 - 14501 퇴사

마루설아 2025. 2. 12. 11:30

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

 

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

using namespace std;

/******** 전역변수 ********/
int day[16];
int pay[16];
int maxpay[16];

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


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

	/******** 지역변수 ********/
	int input1;
	int input2;
	int input3;
	int idx;
	int max;

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

	// 기간, 금액 배열에 삽입
	for (int i = 1; i <= input1; i++) {
		cin >> input2 >> input3;
		day[i] = input2;
		pay[i] = input3;
	}

	// 각 날짜에 받을 수 있는 최대 금액을 계산 (가장 뒤쪽 날짜부터)
	for (int i = input1; i > 0; i--) {
		// 현재 날짜 + 상담 기간이 퇴사일을 초과하면 그 날의 금액는 0원
		if (i + day[i] > input1 + 1) maxpay[i] = 0;

		// 현재 날짜 + 상담 기간이 퇴사일 이내일 때,
		else {
			// 1. 최대 금액을 해당 날의 금액으로 우선 저장
			maxpay[i] = pay[i];

			// 2. 그 날의 최대금액 + 상담 기간이 지난 후 한번 더 받을 수 있는 최대 금액 검색 후 저장
			// 현재 날짜 + 상담 기간을 idx에 저장
			idx = i + day[i];
			max = 0;

			// 상담기간이 지난 후 퇴사일 이내에 존재하는 최대 금액 검색
			while (idx <= input1) {
				if (max < maxpay[idx]) max = maxpay[idx];
				idx++; // 하루씩 증가
			}

			// 3. 한번 더 받을 수 있는 금액을 다시 저장
			maxpay[i] += max;
		}
	}

	// 받을 수 있는 최대 금액를 출력
	cout << *max_element(maxpay, maxpay + 16);
}