티스토리 뷰


[BOJ 3425(G2)고스택]

언뜻보면 가벼운 구현문제처럼 보이나 생각보다 푸는데 오래걸렸다.

C++ STL에서 제공하는 스택을 이용하여 위에 주어진 연산들을 처리하면 된다.

주어진대로만 구현하는 것은 어렵지 않으나 몇가지 예외처리를 해야 할게있다. 문제에서 주어진것처럼 연산을 할 숫자가 부족할 경우, 0으로 나눴을 경우, 연산 결과의 값이 10억을 넘어갈 경우 에러로 간주해야 한다.

또 내가 오답처리를 받았던 이유 중 하나는 int 오버플로우를 생각하지 못했다.

10억 * 10억 연산을 할 경우 INT가 담을 수 있는 범위를 넘어버려 정상적인 연산이 불가능 하다. 따라서 자료형을 long형으로 처리해야 한다. 

위에 나타난 예외들을 신경쓰며 문제에 주어진 조건대로 구현하면 정답처리를 받을 수 있다.

/*
	21.01.11
	BOJ : 3425 고스택 (https://www.acmicpc.net/problem/3425)
	자료구조/구현
*/
#include <bits/stdc++.h>
using namespace std;

int main() {
	cin.tie(NULL);
	ios::sync_with_stdio(false);

	while (true) {
		//명령어 저장
		vector <pair<string, int>> commandList;
		while (true) {
			string command;
			int num = 0;
			cin >> command;
			if (command == "QUIT") return 0;
			if (command == "END") break;
			if (command == "NUM")
			{
				cin >> num;
			}
			commandList.push_back({ command,num });
		}

		int N;
		cin >> N;
		for (int i = 0; i < N; i++) {
			long V;
			bool isValid = true;
			cin >> V;

			int commandSize = commandList.size();

			
			stack<long> Stack;
			Stack.push(V); //초기값 push
			for (int j = 0; j < commandSize; j++) {
				auto cur = commandList[j];
				if (cur.first == "NUM") {
					int n = cur.second;
					Stack.push(n);
					if (abs(n) > 1000000000) {
						isValid = false;
						break;
					}
				}
				else if (cur.first == "POP") {
					if (Stack.empty()) {
						isValid = false;
						break;
					}
					Stack.pop();
				}
				else if (cur.first == "INV") {
					if (Stack.empty()) {
						isValid = false;
						break;
					}
					long n = Stack.top();
					Stack.pop();
					Stack.push(n * -1);
				}
				else if (cur.first == "DUP") {
					if (Stack.empty()) {
						isValid = false;
						break;
					}
					long n = Stack.top();
					Stack.push(n);
				}
				else if (cur.first == "SWP") {
					if (Stack.size() < 2) {
						isValid = false;
						break;
					}
					long first = Stack.top(); Stack.pop();
					long second = Stack.top(); Stack.pop();
					Stack.push(first);
					Stack.push(second);
				}
				else if (cur.first == "ADD") {
					if (Stack.size() < 2) {
						isValid = false;
						break;
					}
					long first = Stack.top(); Stack.pop();
					long second = Stack.top(); Stack.pop();
					if (abs(first + second) > 1000000000) {
						isValid = false;
						break;
					}

					Stack.push(first + second);
				}
				else if (cur.first == "SUB") {
					if (Stack.size() < 2) {
						isValid = false;
						break;
					}
					long first = Stack.top(); Stack.pop();
					long second = Stack.top(); Stack.pop();
					if (abs(second - first) > 1000000000) {
						isValid = false;
						break;
					}

					Stack.push(second - first);
				}
				else if (cur.first == "MUL") {
					if (Stack.size() < 2) {
						isValid = false;
						break;
					}
					long first = Stack.top(); Stack.pop();
					long second = Stack.top(); Stack.pop();
					if (abs(first * second) > 1000000000) {
						isValid = false;
						break;
					}

					Stack.push(first * second);
				}
				else if (cur.first == "DIV") {
					if (Stack.size() < 2) {
						isValid = false;
						break;
					}
					long first = Stack.top(); Stack.pop();
					long second = Stack.top(); Stack.pop();

					if (first == 0) {
						isValid = false;
						break;
					}

					long div = abs(second) / abs(first);
					if (first > 0 && second < 0 || first < 0 && second > 0) {
						div = div * -1;
					}
					if (abs(div) > 1000000000) {
						isValid = false;
						break;
					}
					Stack.push(div);
				}
				else if (cur.first == "MOD") {
					if (Stack.size() < 2) {
						isValid = false;
						break;
					}
					long first = Stack.top(); Stack.pop();
					long second = Stack.top(); Stack.pop();

					if (first == 0) {
						isValid = false;
						break;
					}

					long mod = abs(second) % abs(first);
					if (second < 0) {
						mod = mod * -1;
					}
					if (abs(mod) > 1000000000) {
						isValid = false;
						break;
					}
					Stack.push(mod);
				}
			}

			if (!isValid || Stack.size() > 1 || Stack.empty()) {
				cout << "ERROR" << '\n';
			}
			else {
				cout << Stack.top() << '\n';
			}
		}
		cout << '\n';
	}

	return 0;
}

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함