티스토리 뷰
[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;
}
'알고리즘 풀이 > 시뮬레이션' 카테고리의 다른 글
BOJ : 20056 마법사 상어와 파이어볼 (0) | 2021.01.27 |
---|---|
BOJ : 1713 후보 추천하기 (0) | 2021.01.11 |
BOJ : 19238 스타트 택시 (0) | 2021.01.08 |
BOJ : 17837 새로운 게임 2 (0) | 2021.01.03 |
BOJ : 20055 컨베이어 벨트 위의 로봇 (0) | 2021.01.02 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 그리디
- 세그먼트 트리
- nestjs
- 동적계획법
- 시뮬레이션
- 예외처리
- 백준
- Computer Architecture
- 그래프
- 투포인터
- 스레드
- nodeJS
- java
- nest.js
- node.js
- 컴퓨터 구조
- 컴퓨터 통신
- BFS
- ReactNative
- 벨만포드
- boj
- 자바
- 구현
- 중앙대학교
- 백트래킹
- typeORM
- dfs
- 알고리즘
- 재귀
- 자바스크립트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함