[백준 실버3] 1935 : 후위 표기식2

수민이슈·2023년 9월 7일
0

[C++] 코딩테스트

목록 보기
55/116
post-thumbnail

🖊️ 문제

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


🖊️ 풀이

후위 표기식으로 표기된 명령을 수행하면 된다.
후위 표기식을ㄹ 수행하기 위해서는 stack을 이용하면 된다.

  1. 피연산자를 만나면 stack에 push한다.
  2. 연산자를 만나면 stack에서 피연산자 2개pop한다.
  3. 두 피연산자를 연산한 뒤 다시 스택에 push한다.

이걸 반복하면 스택에 마지막으로 남은 값이 연산의 결과가 된다.

얼마전에 자구 공부함 ㅎㅎ

그래서 이걸 스택에 넣어서 푼다.

여기서 해결해야 하는 포인트는 크게 두 가지

  1. 후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.
    -> 결과값과 스택에 들어갈 값들을 double로 선언해줘야 한다.

  2. 피연산자들을 ABCDE... 처럼 대문자를 이용해서 치환했다. 이걸 이용하기 위해 난 unordered_map을 이용해서 명령(order)에 있는 문자와 입력받은 숫자를 연결해줬다.

그래서 풀면 아래와 같다

#include <iostream>
#include <stack>
#include <unordered_map>
using namespace std;

int main()
{
	stack<double> st;
	int N;
	string order;
	double answer;
	cin >> N;
	cin >> order;

	unordered_map<char, int> um;
	int num;
	char alpha = 'A';
	for (int i = 0; i < N; i++) {
		cin >> num;
		um[alpha++] = num;
	}

	for (int i = 0; i < order.length(); i++) {
		if (isalpha(order[i])) {
			st.push((double)um[order[i]]);
		}
		else {
			double rhs = st.top();
			st.pop();
			double lhs = st.top();
			st.pop();
			if (order[i] == '+') st.push(lhs + rhs);
			else if (order[i] == '-') st.push(lhs - rhs);
			else if (order[i] == '*') st.push(lhs * rhs);
			else if (order[i] == '/') st.push(lhs / rhs);
		}
	}
	printf("%.2f\n", st.top());
}

0개의 댓글