여섯번째 문제보다 더 처참해서 안올리고 싶었지만, 그래도 반면교사로 삼을 수 있다는 생각이 든다.
합리화를 잘하는 것 같다면 기분탓이다.
// S M U P C - > string or char 사용
// 5 / 3 = 1 , -5 / 3 = -1
// 0 ~ 9 , S M U P C 수식 음수 불가
// C - > 결과 출력
// stack을 사용해서 풀어보자.
// N -> 최대 50만
// S M U P C
//-1 -2 -3 -4 -5
#include <queue>
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
using namespace std;
queue<int> temp;
long long int calTemp(queue<int>& temp) {
long long int tempNumber = 0;
vector<int> tempArray;
while (temp.front() >= 0) {
tempArray.push_back(temp.front());
temp.pop();
}
for (int q = 0; q < tempArray.size(); q++) {
if (tempArray[q] != 0) tempNumber += (tempArray[q] * pow(10, tempArray.size() - q - 1));
}
return tempNumber;
}
int main() {
int N;
string Word;
long long int tempNumber;
long long int res = 0;
int n = 0;
cin >> N >> Word;
for (int i = 0; i < Word.length(); i++) {
switch (Word[i]) {
case 'S':
temp.push(-1);
break;
case 'M':
temp.push(-2);
break;
case 'U':
temp.push(-3);
break;
case 'P':
temp.push(-4);
break;
case 'C':
temp.push(-5);
break;
default:
temp.push(Word[i] - 48);
break;
}
}
vector<int> tempArray;
while (temp.front() >= 0) { // 숫자인동안은
tempArray.push_back(temp.front());
temp.pop();
}
for (int q = 0; q < tempArray.size(); q++) {
if (tempArray[q] != 0) {
res += (tempArray[q] * pow(10, tempArray.size() - q - 1));
}
}
// 초기숫자 정하기
//1MC
int printFlag = 0;
while (temp.size() >= 1) {
switch (temp.front()) {
case -1:
temp.pop();
if (temp.size() == 0 && printFlag == 0) {
cout << "NO OUTPUT";
break;
}
if (temp.size() == 0 && printFlag == 1) {
res = res;
break;
}
if (temp.front() == -5) {
res = res;
break;
}
res = res - calTemp(temp);
break;
case -2:
temp.pop();
if (temp.size() == 0 && printFlag == 0) {
cout << "NO OUTPUT";
break;
}
if (temp.size() == 0 && printFlag == 1) {
res = res;
break;
}
if (temp.front() == -5) {
res = res;
break;
}
res = res * calTemp(temp);
break;
case -3:
temp.pop();
if (temp.size() == 0 && printFlag == 0) {
cout << "NO OUTPUT";
break;
}
if (temp.size() == 0 && printFlag == 1) {
res = res;
break;
}
if (temp.front() == -5) {
res = res;
break;
}
res = res / calTemp(temp);
break;
case -4:
temp.pop();
if (temp.size() == 0 && printFlag == 0) {
cout << "NO OUTPUT";
break;
}
if (temp.size() == 0 && printFlag == 1) {
res = res;
break;
}
if (temp.front() == -5) {
res = res;
break;
}
res = res + calTemp(temp);
break;
case -5:
cout << res << " ";
temp.pop();
printFlag =1;
break;
}
}
return 0;
}
이 문제는, 틀린 횟수보다는 풀이 방법이 더 부끄럽다.
인터넷에서 누군가는 이렇게 풀어야 사람들이 덜 우울하지 않을까?
그래도 아래와 같은 점들을 학습할 수 있었다.
이 문제도 반례를 40분넘게 찾아헤맸는데,
내가 잡지 못하던 것은
1MCM 이었다. (풀이 자체가 수식 개수와는 상관이 없다)
1M 등으로 끝나면 NO OUTPUT 이라는 것은 구현해놨지만,
C가 나와 출력을 한번 한 이후에 M과 같은 연산이 다시 등장하면 어떻게 처리할지가 구현이 안되어 있었다.
결론은 코드를 멍청하게 짜도 돌아가게 하려면 버그를 수정하는 사람은 더 똑똑해야 한다는 점..??
근데 나는 그게 둘다 나라서 더 힘들다는거..?
내일의 나는 오늘보다 똑똑하길 바래본다.