-
백준 19591(독특한 계산기)전공/알고리즘 2020. 10. 14. 20:04
음 자료구조,구현 문제인것 같다.
그리고 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