https://www.acmicpc.net/problem/19591
19591번: 독특한 계산기
숫자, '+', '*', '-', '/'로만 이루어진 길이가 106 이하인 수식이 주어진다. 계산 과정 중의 모든 수는 −263 이상 263 미만이며, 0으로 나누는 경우는 없다. 숫자 앞에 불필요한 0이 있을 수 있다.
www.acmicpc.net
[ 문제풀이 ]
1. 문자열을 입력받을 str 변수를 선언하고, 입력을 받습니다.
2. num을 선언하고, 기호가 아닌 문자가 나오면 num = num * 10 + str[ i ] - '0'을 통해 num을 갱신해 줍니다.
3. 기호가 나온다면 deque<char> symbol에 기호를 push_back 해주고, 첫 번째 문자열이 '-'라면 isFirst를 true로 바꾸고, num의 값에 -1을 곱해준 후 deque<ll> number에 num을 push_back 해줍니다.
4. 이후 규칙에 맞게 계산을 하고, 답을 출력합니다.
[ 소스 코드 ]
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | #include<iostream> #include<deque> #include<string> #define ll long long using namespace std; deque<ll> number; deque<char> symbol; ll ans; ll cal(ll num1, ll num2, char sym) { if (sym == '+') { return num1 + num2; } else if (sym == '-') { return num1 - num2; } else if (sym == '*') { return num1 * num2; } else { return num1 / num2; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); string str; cin >> str; bool isFirst = false; ll num = 0; for (int i = 0; i < str.size(); i++) { if (i == 0 && str[i] == '-') { isFirst = true; } else if (str[i] >= '0') { num = num * 10 + str[i] - '0'; } else { if (isFirst) { isFirst = false; num *= -1; } number.push_back(num); symbol.push_back(str[i]); num = 0; } } if (isFirst) { isFirst = false; num *= -1; } number.push_back(num); if (number.size() == 1) { cout << number.front(); return 0; } while (1) { ll tmp[4] = { 0 }; if (number.size() == 3) { tmp[0] = number.front(); tmp[3] = number.back(); number.pop_back(); number.pop_front(); tmp[1] = tmp[2] = number.front(); } else if (number.size() == 2) { tmp[0] = number.front(); tmp[1] = number.back(); } else { tmp[0] = number.front(); tmp[3] = number.back(); number.pop_back(); number.pop_front(); tmp[1] = number.front(); tmp[2] = number.back(); } if (symbol.size() == 1) { char sym = symbol.front(); cout << cal(tmp[0], tmp[1], sym); return 0; } else { char sym1 = symbol.front(); char sym2 = symbol.back(); if (sym1 == '+' || sym1 == '-') { if (sym2 == '*' || sym2 == '/') { symbol.pop_back(); number.pop_back(); number.push_back(cal(tmp[2], tmp[3], sym2)); number.push_front(tmp[0]); } else { ll num1 = cal(tmp[0], tmp[1], sym1); ll num2 = cal(tmp[2], tmp[3], sym2); if (num1 >= num2) { symbol.pop_front(); number.pop_front(); number.push_front(cal(tmp[0], tmp[1], sym1)); number.push_back(tmp[3]); } else { symbol.pop_back(); number.pop_back(); number.push_back(cal(tmp[2], tmp[3], sym2)); number.push_front(tmp[0]); } } } else if (sym1 == '*' || sym1 == '/') { if (sym2 == '+' || sym2 == '-') { symbol.pop_front(); number.pop_front(); number.push_front(cal(tmp[0], tmp[1], sym1)); number.push_back(tmp[3]); } else { ll num1 = cal(tmp[0], tmp[1], sym1); ll num2 = cal(tmp[2], tmp[3], sym2); if (num1 >= num2) { symbol.pop_front(); number.pop_front(); number.push_front(cal(tmp[0], tmp[1], sym1)); number.push_back(tmp[3]); } else { symbol.pop_back(); number.pop_back(); number.push_back(cal(tmp[2], tmp[3], sym2)); number.push_front(tmp[0]); } } } } } } | cs |
'백준' 카테고리의 다른 글
[ 백준 ] 1684번 - 같은 나머지 (C++) (0) | 2023.10.20 |
---|---|
[ 백준 ] 11578번 - 팀원 모집 (C++) (1) | 2023.10.19 |
[ 백준 ] 14699번 - 관악산 등산 (C++) (1) | 2023.10.17 |
[ 백준 ] 13544번 - 수열과 쿼리 3 (C++) (0) | 2023.10.16 |
[ 백준 ] 5069번 - 미로에 갇힌 상근 (C++) (0) | 2023.10.15 |