PS (C, C++)

[백준/C++] 17952 과제는 끝나지 않아!

최연재 2024. 9. 10. 19:58

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

 

코드

#include <iostream>
#include <stack>
using namespace std;

#define FASTIO ios::sync_with_stdio(false);cin.tie(NULL);
typedef long long ll;

stack<pair<int, int>> st;

int main() {
	FASTIO;
	int n, a, t, order;
	ll ans = 0;
	
	cin >> n;

	while (n--) {
		cin >> order;
		if (order == 1) {
			cin >> a >> t;
			if (t == 1) ans += a;
			else st.push({ a, t-1 });
		}
		else {
			if (!st.empty()) {
				st.top().second--;
				if (st.top().second == 0) {
					ans += st.top().first;
					st.pop();
				}
			}
		}
	}
	cout << ans;
	return 0;
}

설명

과제의 만점과 해결하는 데 걸리는 시간을 pair<int, int>로 해서 과제 정보를 스택에 넣어줍니다. 과제가 주어지는 경우에는 그 즉시 1분을 소모해 과제를 진행하므로 t - 1을 넣어줘야 합니다. (t가 1이면 받은 즉시 완료하는 과제이므로 스택에 넣을 필요 없이 과제 만점 점수만 최종 점수에 더해줍니다.) 과제가 주어지지 않는 경우에는 st.top().second를 1 감소시켜 과제를 진행했음을 표시합니다. 이때 0이 되면 해당 과제를 끝낸 것이니 과제의 만점 점수를 더해줍니다. st.top()을 호출하기 전 st이 empty 상태인지 먼저 확인해주어야 합니다.

 

느낀 점

새로운 과제가 나오면 새 과제부터 한다는 점에서 스택을 이용해 풀어야겠다고 생각했습니다. 바로 구현했고 한 번에 맞았습니다.