본문 바로가기

Algorithm/백준

[백준] 1935번: 후위 표기식2

https://www.acmicpc.net/problem/1935

 

1935번: 후위 표기식2

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. (3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 정수이다)

www.acmicpc.net

후위 표기식으로 쓰여진 식을 계산하는 문제.

중위 표기식을 후위 표기식으로 변환해야 했던 이전문제보다 훨씬 쉽다.

 

식의 글자를 하나씩 탐색하면서

1. 알파벳이 나왔을 경우 - 스택에 알파벳 push

2. 연산자가 나왔을 경우 - 스택에서 알파벳 두개 pop, 알파벳에 대응하는 숫자에 대해 연산자에 맞게 적절히 연산해주면 된다.

 

굳이 주의할 점이라면, 스택에서 알파벳 두개를 팝하는 순서가 연산의 순서와 거꾸로라는 점,

그리고 float이 아니라 double을 사용해야 한다는 점!

(문제에서 숫자 범위를 알려줬으면 더 친절한 문제일 것 같다는.. 생각..^ㅠ)

 

#include <iostream>
#include <string>
#include <stack>

using namespace std;

int num(char alpha) {
	return alpha - 'A';
}

int main() {
	int n;
	string str;
	double arr[26];
	stack<double> s;

	cin >> n >> str;
	for (int i = 0; i < n; i++) cin >> arr[i];

	for (int i = 0; i < str.length(); i++) {
		char c = str[i];

		if (c >= 'A' && c <= 'Z') s.push(arr[num(c)]);
		else {
			double num2 = s.top();
			s.pop();
			double num1 = s.top();
			s.pop();

			switch (c) {
			case '+':
				s.push(num1 + num2);
				break;
			case '-':
				s.push(num1 - num2);
				break;
			case '*':
				s.push(num1 * num2);
				break;
			case '/':
				s.push(num1 / num2);
				break;
			}
		}
	}

	printf("%.2lf", s.top());
}

'Algorithm > 백준' 카테고리의 다른 글

[백준] 2304번: 창고 다각형  (0) 2020.03.22
[백준] 1725번: 히스토그램  (0) 2020.03.20
[백준] 1918번: 후위 표기식  (0) 2020.03.19
[백준] 5430번: AC  (0) 2020.03.19
[백준] 3078번: 좋은 친구  (0) 2020.03.19