문제 링크: https://www.acmicpc.net/problem/3425
안틀리고 풀고 싶었는데 몇 번 틀렸네요 쩝
오버플로우, 스택에 수 모자랄 때, 0으로 나누거나 모듈러 연산 할 때 등 예외처리 잘 해주면 됩니다.
음수 모듈러가 좀.. 그런데요; C++이면 그냥 b % a 이런식으로 쓰면 됩니다. -13 % 4 = -1, -13 % -4 = -1 이 지문에서 음수 모듈러 방식을 유추하라는건지 뭐 암튼 그렇습니다
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
constexpr int ABS_MAX = 1e9;
enum OPERATION {NUM, POP, INV, DUP, SWP, ADD, SUB, MUL, DIV, MOD};
inline int opidx(string s) {
if (s == "NUM") return NUM;
else if (s == "POP") return POP;
else if (s == "INV") return INV;
else if (s == "DUP") return DUP;
else if (s == "SWP") return SWP;
else if (s == "ADD") return ADD;
else if (s == "SUB") return SUB;
else if (s == "MUL") return MUL;
else if (s == "DIV") return DIV;
else if (s == "MOD") return MOD;
static_assert(1);
return -1;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
string op;
while (1) {
vector<pair<int, int>> ops; // operation, operand
while (cin >> op) {
if (op == "QUIT") return 0;
int operand = 0;
if (op == "END") break;
if (op == "NUM") cin >> operand;
ops.emplace_back(opidx(op), operand);
}
int n;
cin >> n;
while (n--) {
int in;
cin >> in;
stack<int> st;
st.push(in);
// check
// 1. overflow
// 2. stack size
// 3. div/mod by zero
bool error = false;
for (auto&& [op, operand] : ops) {
if (error) break;
switch (op) {
case NUM:
st.push(operand);
break;
case POP:
if (st.empty()) error = true;
else st.pop();
break;
case INV:
if (st.empty()) error = true;
else {
auto tmp = st.top(); st.pop();
st.push(-tmp);
}
break;
case DUP:
if (st.empty()) error = true;
else st.push(st.top());
break;
case SWP:
if (st.size() < 2) error = true;
else {
auto a = st.top(); st.pop();
auto b = st.top(); st.pop();
st.push(a);
st.push(b);
}
break;
case ADD:
if (st.size() < 2) error = true;
else {
auto a = st.top(); st.pop();
auto b = st.top(); st.pop();
if (abs(a + b) > ABS_MAX) error = true;
else st.push(a + b);
}
break;
case SUB:
if (st.size() < 2) error = true;
else {
auto a = st.top(); st.pop();
auto b = st.top(); st.pop();
if (abs(b-a) > ABS_MAX) error = true;
else st.push(b-a);
}
break;
case MUL:
if (st.size() < 2) error = true;
else {
ll a = st.top(); st.pop();
ll b = st.top(); st.pop();
if (abs(a*b) > ABS_MAX) error = true;
else st.push(a*b);
}
break;
case DIV:
if (st.size() < 2) error = true;
else {
auto a = st.top(); st.pop();
auto b = st.top(); st.pop();
if (a==0) error = true;
else {
int neg_cnt = (a < 0) + (b < 0);
st.push((abs(b) / abs(a)) * (neg_cnt % 2 ? -1 : 1));
}
}
break;
case MOD:
if (st.size() < 2) error = true;
else {
auto a = st.top(); st.pop();
auto b = st.top(); st.pop();
if (a == 0) error = true;
else {
st.push(b%a);
}
}
break;
}
} // for ops
if (error || st.size() != 1)
cout << "ERROR\n";
else
cout << st.top() << '\n';
} // while (n--)
cout << '\n';
}
return 0;
}
게시판 찾아보면 대회 in, out 파일 있으니 정 안되면 그거로 디버깅하는걸 추천합니다
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 12852: 1로 만들기 2 (0) | 2020.07.08 |
---|---|
[백준][C++] 2170: 선 긋기 (0) | 2020.07.08 |
[백준][C++] 9177: 단어 섞기 (0) | 2020.07.07 |
[백준][C++] 10211: Maximum Subarray (0) | 2020.07.07 |
[백준][C++] 10219: Meats On The Grill (0) | 2020.07.07 |