ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 19591(독특한 계산기)
    전공/알고리즘 2020. 10. 14. 20:04

    www.acmicpc.net/problem/19591

     

    19591번: 독특한 계산기

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

    www.acmicpc.net

    음 자료구조,구현 문제인것 같다. 

     

    그리고 stoll함수에 대해서 알고 있으면 좋을듯? 

     

    일단 스트링으로 받는다. 그 뒤에 숫자와 연산자를 따로 저장. deque에 저장하면 아주 좋을것같아서 deque를 처음으로 사용해보았다. 

     

    그 뒤에 주어진 연산기능 그대로 구현을 하면된다. 

     

    구현과정은 좀 까다로울수있다고 생각한다.

    어떻게 구현할지 잘 생각하고, 구현하는게 관건인 문제였다. 

     

    아 그리고 오버플로우 조심하자

     

    쓸데없는 0이 최대 몇개나올지 안나와있다. 

     

    #include<iostream>
    #include<string>
    #include<deque>
    #include<vector>
    using namespace std;
    
    string s;
    deque<long long int> num;
    deque<char> cal;
    
    int main() {
    	cin >> s;
    	bool check = false;
    	for (int i = 0; i < s.size();) {
    		long long int n = 0;
    		if (s.at(i) == '+' || s.at(i) == '-' || s.at(i) == '*' || s.at(i) == '/') {
    			if (i == 0) {
    				check = true;
    				i++;
    				continue;
    			}
    			cal.push_back(s.at(i));
    			i++;
    		}
    		else {
    			vector<long long int> v;
    			bool chk = false;
    			while (i < s.size()) {
    				if (s.at(i) == '+' || s.at(i) == '-' || s.at(i) == '*' || s.at(i) == '/')break;
    				if (s.at(i) == '0' && !chk) {
    					i++;
    					continue;
    				}
    				chk = true;
    				v.push_back(s.at(i) - '0');
    				i++;
    			}
    			if (!chk) {
    				v.push_back(0);
    			}
    			long long int mul = 1;
    			for (int j = 0; j < v.size() - 1; j++) {
    				mul *= 10;
    			}
    			for (int j = 0; j < v.size(); j++) {
    				n += mul * v[j];
    				mul /= 10;
    			}
    
    			if (check) {
    				num.push_back(-n);
    				check = false;
    			}
    			else {
    				num.push_back(n);
    			}
    		}
    	}
    
    	while (num.size() > 1) {
    		int last = num.size() - 1;
    		long long int n1 = num[0];
    		long long int n2 = num[1];
    		long long int n3 = num[last - 1];
    		long long int n4 = num[last];
    		if (cal.front() == '*' || cal.front() == '/') {
    			if (cal.back() == '*' || cal.back() == '/') {
    				if (cal.front() == '*') {
    					n1 = n1 * n2;
    				}
    				else {
    					n1 = n1 / n2;
    				}
    				if (cal.back() == '*') {
    					n3 = n3 * n4;
    				}
    				else {
    					n3 = n3 / n4;
    				}
    				if (n1 >= n3) {
    					num.pop_front();
    					num.pop_front();
    					cal.pop_front();
    					num.push_front(n1);
    				}
    				else {
    					num.pop_back();
    					num.pop_back();
    					cal.pop_back();
    					num.push_back(n3);
    				}
    			}
    			else {
    				if (cal.front() == '*') {
    					n1 = n1 * n2;
    				}
    				else {
    					n1 = n1 / n2;
    				}
    				num.pop_front();
    				num.pop_front();
    				cal.pop_front();
    				num.push_front(n1);
    			}
    
    		}
    
    		else {
    			if (cal.back() == '*' || cal.back() == '/') {
    				if (cal.back() == '*') {
    					n3 = n3 * n4;
    				}
    				else {
    					n3 = n3 / n4;
    				}
    				num.pop_back();
    				num.pop_back();
    				cal.pop_back();
    				num.push_back(n3);
    			}
    			else {
    				if (cal.front() == '+') {
    					n1 = n1 + n2;
    				}
    				else {
    					n1 = n1 - n2;
    				}
    				if (cal.back() == '+') {
    					n3 = n3 + n4;
    				}
    				else {
    					n3 = n3 - n4;
    				}
    				if (n1 >= n3) {
    					num.pop_front();
    					num.pop_front();
    					cal.pop_front();
    					num.push_front(n1);
    				}
    				else {
    					num.pop_back();
    					num.pop_back();
    					cal.pop_back();
    					num.push_back(n3);
    				}
    			}
    
    
    		}
    	}
    	cout << num[0];
    }

     

     

    '전공 > 알고리즘' 카테고리의 다른 글

    백준 1053(팰린드롬 공장)  (0) 2020.10.22
    백준 19576(약수)  (0) 2020.10.17
    백준 20047(동전 옮기기)  (0) 2020.10.14
    백준 6166(Meteor Shower)  (0) 2020.10.10
    백준 11998(Milk Pails)  (0) 2020.10.09

    댓글

Designed by Tistory.