문제
풀이

💡Idea

프로그램을 string으로 저장해두고, 실행할 때마다 불러와 읽으면 된다. 프로그램의 명령들은 vector<string> p로 저장했고, 프로그램대로 실행하는 함수func()를 구현했다. func()가 너무 길어 아래로 치워버렸다.
10^9 연산으로 지지고 볶고 하니까 int범위가 넘어갈 수 있다. long long으로 설정해주자.

🔑Code

#include <bits/stdc++.h>
using namespace std;

void func(vector<string> &p, int v);

int main(void) {
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	while (true) {
		string cmd;
		cin >> cmd;
		// 종료
		if (cmd == "QUIT") {
			return 0;
		}
		
		// 프로그램 입력 받음
		vector<string> p;
		while (cmd != "END") {
			p.emplace_back(cmd);
			cin >> cmd;
		}

		int N; // 실행 횟수
		cin >> N;
		while (N--) {
			int v;
			cin >> v;
			func(p, v);
		}
		cout << '\n';
	}

	return 0;
}

void func(vector<string> &p, int v) {
	stack<long long> s;
	s.emplace(v);

	for(int i = 0; i < (int)(p.size()); i++) {
		string cmd = p[i];
		if (cmd == "NUM") {
			long long num = stoi(p[++i]);
			s.emplace(num);
		}
		else if (cmd == "POP") {
			if (s.empty()) { cout << "ERROR\n"; return; }
			s.pop();
		}
		else if (cmd == "INV") {
			if (s.empty()) { cout << "ERROR\n"; return; }
			long long tmp = s.top(); s.pop();
			s.emplace(-tmp);
		}
		else if (cmd == "DUP") {
			if (s.empty()) { cout << "ERROR\n"; return; }
			s.emplace(s.top());
		}
		else if (cmd == "SWP") {
			if (s.size()<2) { cout << "ERROR\n"; return; }
			long long tmp1 = s.top(); s.pop();
			long long tmp2 = s.top(); s.pop();
			s.emplace(tmp1);
			s.emplace(tmp2);
		}
		else if (cmd == "ADD") {
			if (s.size() < 2) { cout << "ERROR\n"; return; }
			long long tmp1 = s.top(); s.pop();
			long long tmp2 = s.top(); s.pop();
			long long res = tmp2 + tmp1;
			if( abs(res) > 1'000'000'000) { cout << "ERROR\n"; return; }
			s.emplace(res);
		}
		else if (cmd == "SUB") {
			if (s.size() < 2) { cout << "ERROR\n"; return; }
			long long tmp1 = s.top(); s.pop();
			long long tmp2 = s.top(); s.pop();
			long long res = tmp2 - tmp1;
			if (abs(res) > 1'000'000'000) { cout << "ERROR\n"; return; }
			s.emplace(res);
		}
		else if (cmd == "MUL") {
			if (s.size() < 2) { cout << "ERROR\n"; return; }
			long long tmp1 = s.top(); s.pop();
			long long tmp2 = s.top(); s.pop();
			long long res = tmp2 * tmp1;
			if (abs(res) > 1'000'000'000) { cout << "ERROR\n"; return; }
			s.emplace(tmp2 * tmp1);
		}
		else if (cmd == "DIV") {
			if (s.size() < 2) { cout << "ERROR\n"; return; }
			long long tmp1 = s.top(); s.pop();
			long long tmp2 = s.top(); s.pop();
			if (tmp1==0) { cout << "ERROR\n"; return; }
			long long res = abs(tmp2) / abs(tmp1);
			if (abs(res) > 1'000'000'000) { cout << "ERROR\n"; return; }
			if (((tmp1 < 0) && (tmp2 > 0)) || ((tmp1 > 0) && (tmp2 < 0))) res *= -1;
			s.emplace(res);
		}
		else if (cmd == "MOD") {
			if (s.size() < 2) { cout << "ERROR\n"; return; }
			long long tmp1 = s.top(); s.pop();
			long long tmp2 = s.top(); s.pop();
			if (tmp1 == 0) { cout << "ERROR\n"; return; }
			long long res = abs(tmp2) % abs(tmp1);
			if (abs(res) > 1'000'000'000) { cout << "ERROR\n"; return; }
			if (tmp2 < 0) res *= -1;
			s.emplace(res);
		}
		else if (cmd == "END") {
			break;
		}
	}

	if (s.size() != 1)
		cout << "ERROR\n";
	else
		cout << s.top() <<'\n';
	return;
}

🗨️ Side Notes

프로그램 안에 프로그램을 짜는 프로그래머, 그게 바로 나