[일곱번째 문제] 백준 / 21737 : SMPUC 계산기

‍sw·2021년 10월 10일
0

1일 1문제

목록 보기
7/9

여섯번째 문제보다 더 처참해서 안올리고 싶었지만, 그래도 반면교사로 삼을 수 있다는 생각이 든다.

합리화를 잘하는 것 같다면 기분탓이다.

//  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;
}

이 문제는, 틀린 횟수보다는 풀이 방법이 더 부끄럽다.

인터넷에서 누군가는 이렇게 풀어야 사람들이 덜 우울하지 않을까?
그래도 아래와 같은 점들을 학습할 수 있었다.

  1. queue를 함수에 &temp로 전달하여 수정하기
  2. 반례찾기 2번째 단계

이 문제도 반례를 40분넘게 찾아헤맸는데,

내가 잡지 못하던 것은
1MCM 이었다. (풀이 자체가 수식 개수와는 상관이 없다)

1M 등으로 끝나면 NO OUTPUT 이라는 것은 구현해놨지만,
C가 나와 출력을 한번 한 이후에 M과 같은 연산이 다시 등장하면 어떻게 처리할지가 구현이 안되어 있었다.

결론은 코드를 멍청하게 짜도 돌아가게 하려면 버그를 수정하는 사람은 더 똑똑해야 한다는 점..??

근데 나는 그게 둘다 나라서 더 힘들다는거..?

내일의 나는 오늘보다 똑똑하길 바래본다.

Hits

0개의 댓글

관련 채용 정보