반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


1. [백준 알고리즘] 백준 15815번 천재 수학자 성필 C++

1) 문제번호 : 15815번

 

2) 문제 출처

www.acmicpc.net/problem/15815

 

15815번: 천재 수학자 성필

길이가 100이 넘지 않는 수식이 예제 입력과 같이 공백 없이 입력된다. 수식은 0부터 9까지의 숫자와 연산자 '+', '-', '*', '/' 로만 이루어져 있다. 또한, 수식의 계산 중간 과정의 모든 결과는 항상 2

www.acmicpc.net

 

2. 문제

평행 세계의 성필은 숫자와 연산자를 만든 당대 최고의 수학자이다. 그리고 놀랍게도 이 숫자와 연산자는 현재 우리가 사용하는 것과 같다. 하지만 수식은 연산자가 피연산자 가운데 위치하는 우리와는 다르게 연산자가 피연산자 뒤에 위치한다고 한다.

우리 세계의 식을 성필의 식으로 바꾸는 방법을 간단히 설명하자면 이렇다. 우선 주어진 식을 연산자의 우선순위에 따라 괄호로 묶어준다. 그런 다음에 괄호 안의 연산자를 괄호의 오른쪽으로 옮겨주면 된다.

예를 들어 a+b*c는 (a+(b*c))의 식과 같게 된다. 그다음에 안에 있는 괄호의 연산자 *를 괄호 밖으로 꺼내게 되면 a+bc*가 된다. 마지막으로 또 +를 괄호의 오른쪽으로 고치면 abc*+가 되게 된다.

천재 수학자 성필은 자신이 만든 이런 간단한 식조차 1초 안에 계산하지 못하는 사람들을 위하여 답을 구해주는 프로그램을 개발하려고 했지만 아쉽게도 성필의 세계에는 프로그래밍 언어가 없다. 프로그래밍을 할 수 있는 우리가 성필을 위해 평행세계의 식을 계산하는 프로그램을 만들어주자.

 

3. 제약사항

4. 입력

길이가 100이 넘지 않는 수식이 예제 입력과 같이 공백 없이 입력된다. 수식은 0부터 9까지의 숫자와 연산자 '+', '-', '*', '/' 로만 이루어져 있다.

또한, 수식의 계산 중간 과정의 모든 결과는 항상 2,147,483,647을 넘지 않는 정수이고 0으로 나누는 경우는 없습니다.

잘못된 수식이 입력되는 경우도 없습니다.

 

5. 출력

입력으로 주어진 성필의 수식의 답을 첫째 줄에 출력한다.

 

6. 풀이

- 스택을 만들어서 연산 기호가 나오지 않으면 스택에 push를 하고 연산 기호가 나오면 2개의 숫자를 pop해서 기호에 맞게 연산을 해주면 된다.

7. 소스 코드

//15815번 천재 수학자 성필
#include<iostream>
#include<queue>
#include<string>
#include<stack>
#include<stdlib.h>
using namespace std;

int main() {
	string s;
	char k[100];
	int a, b;
	int result = 0;
	cin >> s;
	stack<int> num;
	//queue<char> oper;
	for(int i=0; i<s.length(); i++){
		if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
		{
			b = num.top();
			num.pop();
			a = num.top();
			num.pop();
			switch (s[i]) {
				case '+':
					result = a + b;
					num.push(result);
					break;
				case '-':
					result = a - b;
					num.push(result);
					break;
				case '*':
					result = a * b;
					num.push(result);
					break;
				case '/':
					result = a / b;
					num.push(result);
					break;
		}
		}
		else	num.push(s[i]-'0');
	}
	cout << result;
	return 0;
}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기