문제
각 DVD 상품의 최대 보유량
m, 현재 재고s, 이벤트 수t가 주어지고S amount(대여)와R amount(반납) 이벤트가 이어진다. 모든 이벤트 처리 후 상품 코드와 최종 재고를 출력한다. 재고는 0 이하가 될 수 없고m을 초과할 수도 없다.
풀이
상품 코드가 #일 때까지 반복하면서 t개의 이벤트를 처리한다. S는 대여로 s를 감소시키되 음수가 되면 0으로 클램핑, R은 반납으로 s를 증가시키되 m을 초과하면 m으로 클램핑한다. 입출력 동기화를 꺼서 처리 속도를 확보한다.
코드
#include <iostream>
#include <string>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string stockCode;
while (cin >> stockCode && stockCode != "#") {
int m, s, t;
cin >> m >> s >> t;
for (int i = 0; i < t; ++i) {
char type;
int amount;
cin >> type >> amount;
if (type == 'S') {
s -= amount;
if (s < 0) s = 0;
} else if (type == 'R') {
s += amount;
if (s > m) s = m;
}
}
cout << stockCode << " " << s << "\n";
}
return 0;
}복잡도
- 시간: O(상품 수 * t)
- 공간: O(1)