본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 3425번 : 고스택

반응형

https://www.acmicpc.net/problem/3425

 

3425번: 고스택

각각의 입력값에 대해서, 해당하는 프로그램을 수행한 뒤, 출력값을 출력하면 된다. 출력값이란 스택에 저장되어 있는 숫자이다. 만약, 프로그램 에러가 발생하거나, 모든 수행이 종료됐을 때

www.acmicpc.net

구현 문제였습니다.

 

풀이방법

 * 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';
	}
}