ㅂhttps://www.acmicpc.net/problem/19591
19591번: 독특한 계산기
숫자, '+', '*', '-', '/'로만 이루어진 길이가 106 이하인 수식이 주어진다. 계산 과정 중의 모든 수는 −263 이상 263 미만이며, 0으로 나누는 경우는 없다. 숫자 앞에 불필요한 0이 있을 수 있다.
www.acmicpc.net
과정
- 첫 문자열이 - 인지 확인하고 - 라면 처음 숫자는 -로 변경 해준다.
- 다음 문자열이 숫자인지 연산자 인지 확인하고 연산자인 경우 여태 계산한 숫자를 숫자덱에 추가하고 0으로 돌린다.
- 연산자 우선순위가 동일한지 확인하고 다르다면 우선인 것 부터 계산한다.
- 동일하다면 두 경우를 전부 계산해보고 큰 걸 선택한다.
예제
-00022
-22
#include<iostream>
#include<deque>
#include<map>
using namespace std;
map<char, int> enumop;
deque<long long> nums;
deque<char> ops;
void input(){
long long a = 0;
string input;
cin>>input;
bool mf = input[0] == '-';
for(int i=0;i<input.length();++i){
if(i == 0 && input[i] == '-'){
continue;
}
else if(input[i]>='0'&&input[i]<='9'){
if(a == 0)
a = input[i] - '0';
else{
a = a*10 + (input[i] - '0');
}
}
else{
ops.push_back(input[i]);
if(mf)
nums.push_back(-a);
else
nums.push_back(a);
mf = false;
a = 0;
}
}
if(mf)
nums.push_back(-a);
else
nums.push_back(a);
enumop['*'] = 3;
enumop['/'] = 3;
enumop['+'] = 5;
enumop['-'] = 5;
}
long long calc(char op, long long num1, long long num2){
switch (op)
{
case '*':
return num1 * num2;
case '/':
return num1 / num2;
case '+':
return num1 + num2;
case '-':
return num1 - num2;
}
return -1;
}
void solution(){
while(!ops.empty()){
char lop = ops.front(), rop = ops.back();
long long l1 = nums.front(), r2 = nums.back();
long long l2, r1;
nums.pop_front(); nums.pop_back();
if(nums.empty()){
r1 = l1;
l2 = r2;
}
else{
l2 = nums.front();
r1 = nums.back();
}
if(enumop[lop] == enumop[rop]){
long long calc1 = calc(lop, l1, l2), calc2 = calc(rop, r1, r2);
if(calc1 >= calc2){
nums.push_back(r2);
ops.pop_front();
nums.pop_front();
nums.push_front(calc1);
}
else{
nums.push_front(l1);
ops.pop_back();
nums.pop_back();
nums.push_back(calc2);
}
}
else if(enumop[lop] > enumop[rop]){
nums.push_front(l1);
ops.pop_back();
nums.pop_back();
nums.push_back(calc(rop, r1, r2));
}
else{
nums.push_back(r2);
ops.pop_front();
nums.pop_front();
nums.push_front(calc(lop, l1, l2));
}
}
cout<<nums.front()<<'\n';
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
input();
solution();
return 0;
}

728x90
'알고리즘 > 백준 문제' 카테고리의 다른 글
| 19942 - 다이어트 (0) | 2023.07.13 |
|---|---|
| 19949 - 영재의 시험 (0) | 2023.07.13 |
| 20057 - 마법사 상어와 토네이도 (0) | 2023.07.12 |
| 8980 - 택배 (0) | 2023.07.12 |
| 9527 - 1의 개수 세기 (0) | 2023.07.07 |
댓글