stack
자료구조를 사용한다.pop()
을 2회 수행하고 계산결과를 push()
한다.1e9
를 넘어가는 경우.
string operation;
while(cin >> operation) {
if (operation == "QUIT") return 0;
if (operation == "END") break;
int operand = 0;
if (operation == "NUM") cin >> operand;
commands.push_back({changeFormat(operation), operand});
}
while(cin >> operation)
을 사용하면 빈 줄을 입력받을 때 while문을 탈출합니다.QUIT
명령어와 END
명령어를 입력받으면 while문을 탈출합니다.NUM
명령어인 경우 뒤에 숫자가 오므로 추가로 operand
를 입력받습니다. 그 외에는 0
입니다.changeFormet()
함수는 switch-case 문을 사용하기 위해 operation
을 해당하는 번호로 매핑합니다.int
범위를 넘어갈 수 있으므로 long long
을 사용합니다. int cnt = (왼쪽 < 0) + (오른쪽 < 0);
stk.push((abs(오른쪽) / abs(왼쪽)) * (cnt % 2 ? -1 : 1));
cnt
가 홀수인지 짝수인지에 따라 몫에 1
또는 -1
을 곱해줍니다.#include <iostream>
#include <vector>
#include <stack>
#include <cmath>
using namespace std;
using ll = long long;
vector<pair<int, int>> commands;
int changeFormat(const string& s) {
if (s == "NUM") return 0;
if (s == "POP") return 1;
if (s == "INV") return 2;
if (s == "DUP") return 3;
if (s == "SWP") return 4;
if (s == "ADD") return 5;
if (s == "SUB") return 6;
if (s == "MUL") return 7;
if (s == "DIV") return 8;
if (s == "MOD") return 9;
return -1;
}
int main() {
ios::sync_with_stdio(false), cin.tie(NULL);
while(1) {
commands.clear();
// 하나의 기계에 대한 명령어를 입력받는다.
string operation;
while(cin >> operation) {
if (operation == "QUIT") return 0;
if (operation == "END") break;
int operand = 0;
if (operation == "NUM") cin >> operand;
commands.push_back({changeFormat(operation), operand});
}
int testCase = 0;
cin >> testCase;
while(testCase--) {
int inputVar = 0;
cin >> inputVar;
stack<ll> stk;
stk.push(inputVar);
bool errFlag = false;
for (const auto& cmd : commands) {
if (errFlag) break;
switch(cmd.first) {
case 0: // NUM X operation
stk.push(cmd.second);
break;
case 1: // POP operation
if (stk.empty()) errFlag = true;
else stk.pop();
break;
case 2: // INV operation
if (stk.empty()) errFlag = true;
else {
ll lhs = stk.top(); stk.pop();
stk.push(-lhs);
}
break;
case 3: // DUP operation
if (stk.empty()) errFlag = true;
else stk.push(stk.top());
break;
case 4: // SWP operation
if (stk.size() < 2) errFlag = true;
else {
ll lhs = stk.top(); stk.pop();
ll rhs = stk.top(); stk.pop();
stk.push(lhs);
stk.push(rhs);
}
break;
case 5: // ADD operation
if (stk.size() < 2) errFlag = true;
else {
ll lhs = stk.top(); stk.pop();
ll rhs = stk.top(); stk.pop();
ll sum = lhs + rhs;
if (abs(sum) > 1e9) errFlag = true;
else stk.push(sum);
}
break;
case 6: // SUB operation
if (stk.size() < 2) errFlag = true;
else {
ll lhs = stk.top(); stk.pop();
ll rhs = stk.top(); stk.pop();
ll sum = rhs - lhs;
if (abs(sum) > 1e9) errFlag = true;
else stk.push(sum);
}
break;
case 7: // MUL operation
if (stk.size() < 2) errFlag = true;
else {
ll lhs = stk.top(); stk.pop();
ll rhs = stk.top(); stk.pop();
ll sum = lhs * rhs;
if (abs(sum) > 1e9) errFlag = true;
else stk.push(sum);
}
break;
case 8: // DIV operation
if (stk.size() < 2) errFlag = true;
else {
ll lhs = stk.top(); stk.pop();
ll rhs = stk.top(); stk.pop();
if (lhs == 0) errFlag = true;
else {
// 피연산자들 중 음수의 개수를 체크한다.
int negativeCnt = (lhs < 0) + (rhs < 0);
stk.push((abs(rhs) / abs(lhs)) * (negativeCnt % 2 ? -1 : 1));
}
break;
}
case 9: // MOD operation
if (stk.size() < 2) errFlag = true;
else {
ll lhs = stk.top(); stk.pop();
ll rhs = stk.top(); stk.pop();
if (lhs == 0) errFlag = true;
else stk.push(rhs % lhs);
}
break;
}
}
if (errFlag == true || stk.size() != 1) cout << "ERROR\n";
else cout << stk.top() << '\n';
}
cout << '\n';
}
}