https://www.acmicpc.net/problem/3425
3425번: 고스택
각각의 입력값에 대해서, 해당하는 프로그램을 수행한 뒤, 출력값을 출력하면 된다. 출력값이란 스택에 저장되어 있는 숫자이다. 만약, 프로그램 에러가 발생하거나, 모든 수행이 종료됐을 때
www.acmicpc.net
풀이 과정
스택을 조금 변형한 고스택을 구현하는 문제이다.
문제에서 주어진 대로 구현하면 되나, 프로그램 에러의 3가지 경우를 구현하는데 신경을 써야 한다.
소스 코드
#include <iostream>
#include <string>
#include <stack>
#include <vector>
#define max_value 1000000000
#define min_value -1000000000
using namespace std;
stack<long long> st;
void num(int x) {
st.push(x);
}
int pop() {
if (st.empty()) {
return -1;
} else {
st.pop();
return 1;
}
}
int inv() {
if (st.empty()) {
return -1;
} else {
long long temp = st.top() * -1;
st.pop();
st.push(temp);
return 1;
}
}
int dup() {
if (st.empty()) {
return -1;
} else {
st.push(st.top());
return 1;
}
}
int swp() {
if (st.size() < 2) {
return -1;
} else {
long long first = st.top();
st.pop();
long long second = st.top();
st.pop();
st.push(first);
st.push(second);
return 1;
}
}
int add() {
if (st.size() < 2) {
return -1;
} else {
long long first = st.top();
st.pop();
long long second = st.top();
st.pop();
long long temp = first + second;
if (temp < min_value ||temp > max_value) {
return -1;
}
st.push(temp);
return 1;
}
}
int sub() {
if (st.size() < 2) {
return -1;
} else {
long long first = st.top();
st.pop();
long long second = st.top();
st.pop();
long long temp = second - first;
if (temp < min_value || temp > max_value) {
return -1;
}
st.push(temp);
return 1;
}
}
int mul() {
if (st.size() < 2) {
return -1;
} else {
long long first = st.top();
st.pop();
long long second = st.top();
st.pop();
long long temp = first * second;
if (temp < min_value ||temp > max_value) {
return -1;
}
st.push(temp);
return 1;
}
}
int div() {
if (st.size() < 2) {
return -1;
} else {
long long first = st.top();
st.pop();
long long second = st.top();
st.pop();
if (first == 0) {
return -1;
}
long long temp = second / first;
if (temp < min_value ||temp > max_value) {
return -1;
}
st.push(temp);
return 1;
}
}
int mod() {
if (st.size() < 2) {
return -1;
} else {
long long first = st.top();
st.pop();
long long second = st.top();
st.pop();
if (first == 0) {
return -1;
}
long long temp = second % first;
if (temp < min_value ||temp > max_value) {
return -1;
}
st.push(temp);
return 1;
}
}
int main() {
while (true) {
vector<string> vec;
string str;
while (true) {
cin >> str;
if (str == "END") {
break;
} else if (str == "QUIT") {
return 0;
}
vec.push_back(str);
}
int N;
cin >> N;
while(N--) {
long long initial;
cin >> initial;
int errFlag = 0;
st.push(initial);
for (int i = 0; i < vec.size(); i++) {
if (vec[i] == "NUM") {\
num(stoi(vec[i+1]));
i += 1;
} else if (vec[i] == "POP") {
errFlag = pop();
} else if (vec[i] == "INV") {
errFlag = inv();
} else if (vec[i] == "DUP") {
errFlag = dup();
} else if (vec[i] == "SWP") {
errFlag = swp();
} else if (vec[i] == "ADD") {
errFlag = add();
} else if (vec[i] == "SUB") {
errFlag = sub();
} else if (vec[i] == "MUL") {
errFlag = mul();
} else if (vec[i] == "DIV") {
errFlag = div();
} else if (vec[i] == "MOD") {
errFlag = mod();
}
if (errFlag == -1) {
cout << "ERROR" << '\n';
while (!st.empty()) {
st.pop();
}
break;
}
}
if (errFlag == -1) {
continue;
}
if (st.size() != 1) {
cout << "ERROR" << '\n';
while (!st.empty()) {
st.pop();
}
} else {
cout << st.top() << '\n';
st.pop();
}
}
cout << '\n';
}
return 0;
}
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 1926 - 그림 [C++, 파이썬] (0) | 2022.07.10 |
---|---|
백준 1103 - 게임 [C++] (0) | 2022.07.09 |
백준 1927 - 최소 힙 [C++, 파이썬] (0) | 2022.07.06 |
백준 2748 - 피보나치 수 2 [C++] (0) | 2022.07.05 |
백준 2805 - 나무 자르기 [C++] (0) | 2022.07.05 |