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;
}
}
}
}
'알고리즘' 카테고리의 다른 글
[백준] 1713번 후보 추천하기 C++ 문제풀이 (0) | 2023.08.05 |
---|---|
[백준] 3055번 탈출 C++ 문제풀이 (0) | 2023.08.03 |
[백준] 1920번 수 찾기 C++ 문제 풀이 (0) | 2023.07.31 |
[백준] 2164번 카드2 C++ 문제 풀이 (0) | 2023.07.30 |
[백준] 11866번 요세푸스 문제 0 C++ 문제 풀이 (0) | 2023.07.25 |