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 상태인지 먼저 확인해주어야 합니다.
느낀 점
새로운 과제가 나오면 새 과제부터 한다는 점에서 스택을 이용해 풀어야겠다고 생각했습니다. 바로 구현했고 한 번에 맞았습니다.