본문 바로가기

문과 코린이의, [C. C++] 기록/C++ 백준 문제풀이

[문과 코린이의 IT 기록장] C++ 백준 문제풀이 - 후위 표기식2 (1935)

반응형

[문과 코린이의 IT 기록장] C++ 백준 문제풀이[DP] - 후위 표기식2 (1935)

[문과 코린이의 IT 기록장] C++ 백준 문제풀이[DP] - 후위 표기식2 (1935)

 


 

 

1935번: 후위 표기식2

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이

www.acmicpc.net

[ 문제 ]

후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.

[ 입력 ]

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

후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.

[ 출력 ]

계산 결과를 소숫점 둘째 자리까지 출력한다.

 


[ 코드 ]

#include<iostream>
#include<algorithm>
#include<stack>
#include<iomanip> // setprecision을 위해
using namespace std;

int operand[26]; // operand[0] : A ~ operand[25] : Z
// operand : 피연산자 (연산의 대상)

int main() {
	int N; // 피연산자의 개수
	cin >> N;

	string input; // 값
	cin >> input;

	for (int i = 0; i < N; i++)
	{
		cin >> operand[i];
	}

	stack <double> s;
	// 나눗셈 연산으로 소수점이 나올 수 있으므로 double로 선언

	for (char ch : input)
	{
		if (ch >= 'A' && ch <= 'Z') // 입력값이 알파벳 대문자면
		{
			s.push(operand[ch - 'A']); // 스택에 해당 값 입력
		}
		else // 그 외에 연산이라면
		{
			// 스택 가장 위에 있는 값 두개 꺼내기
			double op2 = s.top(); s.pop();
			double op1 = s.top(); s.pop();
            // int형 나누기의 소수점의 값을 구하려면, double형으로 바꿔야 한다
            // 즉 나눗셈을 할 때는 변수를 double형으로 해줘야 한다.

			// 만약 연산자가 +라면
			if (ch == '+')
			{
				s.push(op1 + op2); // 연산 값을 다시 계산해서 스택에 넣기
			}
			// 만약 연산자가 -라면
			else if (ch == '-')
			{
				s.push(op1 - op2);
			}
			// 만약 연산자가 *라면
			else if (ch == '*')
			{
				s.push(op1 * op2);
			}
			// 만약 연산자가 /라면
			else if (ch =='/')
			{
				s.push(op1 / op2);
			}
		}
	}
	
	cout << fixed << setprecision(2) <<s.top() << '\n';
	// cout << fixed : 소수점 자리 수 고정
	// cout << setprecision(2) : 가장 큰 자리수부터 2자리를 출력하겠다는 뜻 (정수 범위도 포함) - 따라서 6.2 출력
	// cout<< fixed << setprecision(2) : 소수점 아래 숫자의 출력 범위만 2자리로 설정하겠다는 뜻
	return 0;

}
반응형