본문 바로가기
알고리즘/백준 문제

19591 - 독특한 계산기

by HDobby 2023. 7. 13.

https://www.acmicpc.net/problem/19591

 

19591번: 독특한 계산기

숫자, '+', '*', '-', '/'로만 이루어진 길이가 106 이하인 수식이 주어진다. 계산 과정 중의 모든 수는 −263 이상 263 미만이며, 0으로 나누는 경우는 없다. 숫자 앞에 불필요한 0이 있을 수 있다. 

www.acmicpc.net

과정

  1. 첫 문자열이 - 인지 확인하고 - 라면 처음 숫자는 -로 변경 해준다.
  2. 다음 문자열이 숫자인지 연산자 인지 확인하고 연산자인 경우 여태 계산한 숫자를 숫자덱에 추가하고 0으로 돌린다.
  3. 연산자 우선순위가 동일한지 확인하고 다르다면 우선인 것 부터 계산한다.
  4. 동일하다면 두 경우를 전부 계산해보고 큰 걸 선택한다.

예제

-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

댓글