반응형
https://www.acmicpc.net/problem/3425
구현 문제였습니다.
풀이방법
* overflow를 고려해야합니다. 계산 결과가 int범위를 초과할 수 있습니다.
* divide by zero를 조심하세요. 나눗셈 연산에서 제수가 0인 경우 error입니다.
* 문제를 명확히 읽어야 합니다.
* 매 명령어 수행시 LIMIT(10억)을 초과할 수 있습니다.
* 수행결과에는 stack에 원소가 1개만 있어야합니다.
한 입력마다 입력받은 프로그램을 실행할 때 error가 발생하는지를 확인합니다. 에러가 발생했다면 ERROR를 출력하고 아니라면 계산 결과 스택에 남은 한 개의 정수를 출력하면 됩니다.
Code
#include <bits/stdc++.h>
#define ll long long
#define LIMIT 1000000000
using namespace std;
vector <string> operation;
vector <ll> nums;
stack <ll> st;
string op;
ll n,x, isError, num, c;
ll NUM(ll x){
st.push(x);
return 0;
}
ll POP(){
if(st.empty()) return 1;
st.pop();
return 0;
}
ll INV(){
if(st.empty()) return 1;
ll tmp = st.top();
st.pop();
st.push(-tmp);
return 0;
}
ll DUP(){
if(st.empty()) return 1;
st.push(st.top());
return 0;
}
ll SWP(){
if(st.size() < 2) return 1;
ll tmp1 = st.top();
st.pop();
ll tmp2 = st.top();
st.pop();
st.push(tmp1);
st.push(tmp2);
return 0;
}
ll ADD() {
if(st.size() < 2) return 1;
ll tmp1 = st.top();
st.pop();
ll tmp2 = st.top();
st.pop();
st.push(tmp1 + tmp2);
return 0;
}
ll SUB(){
if(st.size() < 2) return 1;
ll tmp1 = st.top();
st.pop();
ll tmp2 = st.top();
st.pop();
st.push(tmp2 - tmp1);
return 0;
}
ll MUL(){
if(st.size() < 2) return 1;
ll tmp1 = st.top();
st.pop();
ll tmp2 = st.top();
st.pop();
st.push(tmp2 * tmp1);
return 0;
}
ll DIV(){
if(st.size() < 2) return 1;
ll tmp1 = st.top();
st.pop();
ll tmp2 = st.top();
st.pop();
if(!tmp1) return 1;
ll result = llabs(tmp2) / llabs(tmp1);
if(tmp1 * tmp2 < 0) result *= -1;
st.push(result);
return 0;
}
ll MOD(){
if(st.size() < 2) return 1;
ll tmp1 = st.top();
st.pop();
ll tmp2 = st.top();
st.pop();
if(!tmp1) return 1;
ll result = llabs(tmp2) % llabs(tmp1);
if(tmp2 < 0) result *= -1;
st.push(result);
return 0;
}
int main(){
while (1) {
nums.clear();
operation.clear();
isError = 0;
while (1) {
cin >> op;
if (op == "QUIT") return 0;
if (op == "END") break;
if (op == "NUM") cin >> x, nums.push_back(x);
operation.push_back(op);
}
cin >> n;
while (n--) {
c = 0;
cin >> num;
st.push(num);
for (ll i = 0; i < operation.size(); ++i) {
if (operation[i] == "NUM") isError = NUM(nums[c++]);
else if (operation[i] == "POP") isError = POP();
else if (operation[i] == "INV") isError = INV();
else if (operation[i] == "DUP") isError = DUP();
else if (operation[i] == "SWP") isError = SWP();
else if (operation[i] == "ADD") isError = ADD();
else if (operation[i] == "SUB") isError = SUB();
else if (operation[i] == "MUL") isError = MUL();
else if (operation[i] == "DIV") isError = DIV();
else if (operation[i] == "MOD") isError = MOD();
if (!st.empty() && (llabs(st.top()) > LIMIT ))
isError = 1;
if (isError) break;
}
if (isError || st.size() != 1) cout << "ERROR\n";
else cout << st.top() << '\n';
while (!st.empty()) st.pop();
}
cout << '\n';
}
}
'Algorithm > Implementation' 카테고리의 다른 글
(C++) - 백준(BOJ) 17826번 : 나의 학점은? (0) | 2021.07.26 |
---|---|
(C++) - 백준(BOJ) 21737번 : SMUPC 계산기 (0) | 2021.07.25 |
(C++) - 백준(BOJ) 2028번 : 자기복제수 (0) | 2021.07.03 |
(C++) - 프로그래머스(2020 KAKAO BLIND RECRUITMENT) : 기둥과 보 설치 (0) | 2021.06.28 |
(C++) - 프로그래머스(2019 KAKAO BLIND RECRUITMENT) : 길 찾기 게임 (0) | 2021.06.22 |