블로그

[1일차] 알고리즘 기초 A - 3425: 고스택 본문

SDS ( -> PS)

[1일차] 알고리즘 기초 A - 3425: 고스택

왕방토 2022. 1. 6. 01:15
728x90

골드 Ⅲ

 

#include <iostream>
#include <cstdlib>
#include <stack>
#include <vector>
#include <string>
#define MAXNUM 1000000000
using namespace std;

int main() {

	while (1) {
		//새 프로그램마다 재정의 -> 비워줄 필요없음
		vector<pair<string, int>> cmds;

		//프로그램 영역
		while (1) {
			string cmd;
			cin >> cmd;
			int X = 0;
			//전체 프로그램 종료
			if (cmd == "QUIT") return 0;
			else if (cmd == "END") break;
			else if (cmd == "NUM") scanf("%d", &X);
			cmds.push_back(make_pair(cmd, X));
		}

		int N;
		scanf("%d", &N);

		//입력영역
		while (N--) {
			//재정의
			stack<int> gostack;
			int baseNum;
			scanf("%d", &baseNum);
			gostack.push(baseNum);

			int is_error = 0;
			for (int i = 0; i < cmds.size(); i++) {
				string cmd = cmds[i].first;
				int X = cmds[i].second;

				if (cmd == "NUM") gostack.push(X);
				else if (cmd == "POP") {
					if (gostack.empty()) {
						is_error = 1;
						break;
					}
					gostack.pop();
				}
				else if (cmd == "INV") {
					if (gostack.empty()) {
						is_error = 1;
						break;
					}
					gostack.push((-1) * gostack.top());
				}
				else if (cmd == "DUP") {
					if (gostack.empty()) {
						is_error = 1;
						break;
					}
					gostack.push(gostack.top());
				}
				else if (cmd == "SWP") {
					if (gostack.size() < 2) {
						is_error = 1;
						break;
					}
					int top1 = gostack.top();
					gostack.pop();
					int top2 = gostack.top();
					gostack.pop();
					gostack.push(top1);
					gostack.push(top2);
				}
				else if (cmd == "ADD") {
					if (gostack.size() < 2) {
						is_error = 1;
						break;
					}
					long long top1 = gostack.top();
					gostack.pop();
					long long top2 = gostack.top();
					gostack.pop();
					long long result = top1 + top2;
					if (abs(result) > MAXNUM) {
						is_error = 1;
						break;
					}
					gostack.push(result);
				}
				else if (cmd == "SUB") {
					if (gostack.size() < 2) {
						is_error = 1;
						break;
					}
					long long top1 = gostack.top();
					gostack.pop();
					long long top2 = gostack.top();
					gostack.pop();
					long long result = top2 - top1;
					if (abs(result) > MAXNUM) {
						is_error = 1;
						break;
					}
					gostack.push(result);
				}
				else if (cmd == "MUL") {
					if (gostack.size() < 2) {
						is_error = 1;
						break;
					}
					long long top1 = gostack.top();
					gostack.pop();
					long long top2 = gostack.top();
					gostack.pop();
					//long long 범위안에 들어감
					long long result = top1 * top2;
					if (abs(result) > MAXNUM) {
						is_error = 1;
						break;
					}
					gostack.push(result);
				}
				else if (cmd == "DIV") {
					if (gostack.size() < 2) {
						is_error = 1;
						break;
					}
					int top1 = gostack.top();
					gostack.pop();
					//DIVBYZERO
					if (top1 == 0) {
						is_error = 1;
						break;
					}
					int top2 = gostack.top();
					gostack.pop();
					int minusCnt = (top1 < 0) + (top2 < 0);
					gostack.push(abs(top2) / abs(top1) * (minusCnt == 1 ? -1 : 1));
				}
				else if (cmd == "MOD") {
					if (gostack.size() < 2) {
						is_error = 1;
						break;
					}
					int top1 = gostack.top();
					gostack.pop();
					//DIVBYZERO
					if (top1 == 0) {
						is_error = 1;
						break;
					}
					int top2 = gostack.top();
					gostack.pop();
					gostack.push(top2 % top1);
				}
			}

			//해당 baseNum에 대한 연산 종료
			if (is_error == 1 || gostack.size() != 1) printf("ERROR\n");
			else printf("%d\n", gostack.top());
		}
		printf("\n");
	}
}

놀랍게도 이거 푸느라 1일차 dfs bfs 거의 다 날렸다

왜그러냐 진짜??!

 

게다가 계속 틀렸다

아직도 모르겠다

예외처리 안됐거나 문제를 잘못 읽은거일듯

Comments