본문 바로가기

알고리즘

[백준] 3425번 고스택 C++ 문제풀이

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

 

문제 풀이

몇가지 문제의 주의점을 설정하고 문제를 풀었다.

1) 모든 수행이 종료됐을 때 스택에 저장되어 있는 숫자가 1개가 아니라면, "ERROR"를 출력 -> cnt라는 변수를 통해 해결

2) DIV와 MOD계산에서 +와 - 부호를 잘 확인 -> 첫 번째, 두 번째 숫자의 부호를 확인

3) 연산 시 배열의 크기를 주의

4) 조건에 맞지 않으면 바로 중단 후 "ERROR"출력

 

구현 문제인 만큼 코드가 너무 길다.

처음에는 int를 이용해 풀었는데, IntegerOverflow 에러가 나와서 long long을 이용해 문제를 해결했다.

 

소스코드

#include <iostream>
#include <vector>
#include <string>
using namespace std;
typedef long long ll;

vector<string> command_vec;
ll Stack[1001] = { 0 };
int idx = 0; // 다음에 숫자가 들어갈 칸
int cnt = 0;

bool NUM(string a) {
	ll x = stoi(a); 
	if (x > 1000000000) {
		return false;
	}
	else if (x < -100000000) {
		return false;
	}
	else {
		Stack[idx] = x;
		idx++;
		return true;
	}
}

bool POP() {
	if (idx == 0) {
		return false;
	}
	else {
		Stack[idx - 1] = 0;
		idx--;
		return true;
	}
}

bool INV() {
	if (idx == 0) {
		return false;
	}
	else {
		Stack[idx - 1] *= -1;
		return true;
	}
}
bool DUP() {
	if (idx == 0) {
		return false;
	}
	else {
		Stack[idx] = Stack[idx - 1];
		idx++;
		return true;
	}
}
bool SWP() {
	if (idx < 2) {
		return false;
	}
	else {
		ll sub = Stack[idx - 2];
		Stack[idx - 2] = Stack[idx - 1];
		Stack[idx - 1] = sub;
		return true;
	}
}
bool ADD() {
	if (idx < 2) {
		return false;
	}
	else {
		ll sum = Stack[idx - 2] + Stack[idx - 1];
		if (sum > 1000000000) {
			return false;
		}
		else if (sum < -1000000000) {
			return false;
		}
		else {
			Stack[idx - 2] = sum;
			idx--;
			return true;
		}
	}
}
bool SUB() {
	if (idx < 2) {
		return false;
	}
	else {
		ll sum = Stack[idx - 2] - Stack[idx - 1];
		if (sum > 1000000000) {
			return false;
		}
		else if (sum < -1000000000) {
			return false;
		}
		else {
			Stack[idx - 2] = sum;
			idx--;
			return true;
		}
	}
}
bool MUL() {
	if (idx < 2) {
		return false;
	}
	else {
		ll sum = Stack[idx - 2] * Stack[idx - 1];
		if (sum > 1000000000) {
			return false;
		}
		else if (sum < -1000000000) {
			return false;
		}
		else {
			Stack[idx - 2] = sum;
			idx--;
			return true;
		}
	}
}
bool DIV() {
	if (idx < 2) {
		return false;
	}
	else {
		if (Stack[idx - 1] == 0) {
			return false;
		}
		int neg = 0;
		ll x = Stack[idx - 1];
		ll y = Stack[idx - 2];
		if (x < 0) {
			neg++;
		}
		if (y < 0) {
			neg++;
		}

		ll sum = y / x;
		if (sum > 1000000000) {
			return false;
		}
		else if (sum < -1000000000) {
			return false;
		}
		else {
			if (neg == 1) {
				sum = -(abs(sum));
			}
			else {
				sum = abs(sum);
			}
			Stack[idx - 2] = sum;
			idx--;
			return true;
		}
	}
}
bool MOD() {
	if (idx < 2) {
		return false;
	}
	else {
		if (Stack[idx - 1] == 0) {
			return false;
		}
		ll sum = Stack[idx - 2] % Stack[idx - 1];
		if (sum > 1000000000) {
			return false;
		}
		else if (sum < -1000000000) {
			return false;
		}
		else {
			Stack[idx - 2] = sum;
			idx--;
			return true;
		}
	}
}

int main() {

	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	while (true) {
		string a;
		cin >> a;
		if (a == "QUIT") {
			return 0;
		}
		else if (a == "END") {
			int N;
			cin >> N;
			for (int i = 0; i < N; i++) {
				cin >> Stack[0]; //cnt는 없음
				idx = 1;

				if (cnt != 0) {
					cout << "ERROR" << '\n';
				}
				else {
					bool tf = true;
					for (int i = 0; i < command_vec.size(); i++) {
						string command = command_vec[i];
						if (command == "NUM") {
							string command_int = command_vec[i + 1];
							tf *= NUM(command_int);
							i += 1;
						}
						else if (command == "POP") {
							tf *= POP();
						}
						else if (command == "INV") {
							tf *= INV();
						}
						else if (command == "DUP") {
							tf *= DUP();
						}
						else if (command == "SWP") {
							tf *= SWP();
						}
						else if (command == "ADD") {
							tf *= ADD();
						}
						else if (command == "SUB") {
							tf *= SUB();
						}
						else if (command == "MUL") {
							tf *= MUL();
						}
						else if (command == "DIV") {
							tf *= DIV();
						}
						else if (command == "MOD") {
							tf *= MOD();
						}

						if (tf == false) {
							break;
						}
					}
					if (tf == true && idx == 1) {
						cout << Stack[0] << '\n';
					}
					else {
						cout << "ERROR" << '\n';
					}

				}
			}
			cnt = 0;
			command_vec.clear();
			cout << '\n';
		}
		else {
			command_vec.push_back(a);
			if (a == "NUM" || a == "DUP") {
				cnt += 1;
			}
			else if (a == "INV" || a == "SWP")
				continue;
			else if (a == "POP" || a == "ADD"||a =="SUB"|| a=="MUL" ||
				a == "DIV" || a == "MOD") {
				cnt -= 1;
			}
		}
	}
}