1 minute read

백준 1935번: 후위 표기식2

문제:

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

입력:

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

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

풀이:

  • 이 문제를 풀 때는 우선 모든 입력 값을 받은 뒤 sting 연산식의 문자를 하나씩 돌면서 연산자가 나오면 스택 제일 위에 값과 두번째 위에 값을 연산 해준다.
  • 만약에 피연산자인 경우는 스택에 그 숫자를 푸쉬 하는데 A가 인덱스 0, B가 인덱스 1…. 이여야 되므로 char 값을 int 값(index) 값으로 변환 해주어야 된다. 이때 알파벳을 숫자로 변환하기 위해서는 아스키 코드의 개념을 이해하면 되는데 ‘A’ = 65이고 ‘B’ = 66 …. 이런 식으로 Z까지 간다. 따라서 현재 알파벳 - ‘A’ or 65를 하게 되면 알파벳 순서를 인덱스처럼 이용할 수 있다. 따라서 그 인덱스에 맞는 숫자를 스택에 넣어준다.

⚠️ 이 문제를 풀 때 주의 해야 될 점은 두가지이다:

  1. float을 이용하여 풀면 숫자가 정확하게 나오지 않아 double을 이용하여야 된다. 처음에 float을 이용하여 풀다가 백준 질문 게시판을 통해 알았다.
  2. 소수 두번째까지 출력을 해야 되기 때문에 printf를 이용하여 풀던가 아니면 cout을 이용하고 싶으면 cout.percision(자릿수)와 std::fixed를 이용하면 된다. 자세한 내용은 아래 코드를 확인하면 된다.

코드:

#include <iostream>
#include <stack>

using namespace std;

int main(){
	int n;
	stack<double> s;
	string equation;
	
	//입력 
	cin >> n;
	cin.ignore();
	getline(cin, equation);
	double numbers[n];
	//숫자만 순서대로 입력 받음
	for(int i = 0; i < n; i++){
		cin >> numbers[i];	
	}
	for(int i = 0; i < equation.size(); i++){
		//연산자일 경우 
		if(equation[i] == '+'||equation[i] == '-'||equation[i] == '*'||equation[i] == '/'){
			double top = s.top();
			s.pop();
			double second_top = s.top();
			s.pop();
			if(equation[i] == '+') s.push(second_top+top);
			else if(equation[i] == '-') s.push(second_top-top);
			else if(equation[i] == '*') s.push(second_top*top);
			else if(equation[i] == '/') s.push(second_top/top);
		}
		//피연산자일 경우 
		else{
			s.push(numbers[equation[i]-'A']); //알파벳으로 적혀 있기 때문에 Index로 변환 
		}
	}
	//소수 두번째 자리까지 출력
	printf("%0.2f", s.top()); 
	/*cout을 이용한 방법
  cout.precision(2);
  cout << fixed << s.top();
	*/
}

Leave a comment