백준 1935(후위 표기식 2)

jh Seo·2022년 10월 26일
0

백준

목록 보기
61/194
post-custom-banner

개요

백준1935번: 후위 표기식 2

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

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

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

접근방식

  1. 처음엔 어떤방식으로 stack과 vector을 적절히 섞어야할지 고민을 했었다.
  2. 그러다 떠올린 방법은 숫자라면 스택에 넣고, 기호가 나온다면 스택의 top 두 개를 꺼내서 연산 후 다시 스택에 넣는 방식이다. 모든 과정이 끝나면 스택에는 마지막 답만 남을것이다.
  3. 입력문자열은 각 char형 원소를 조사를 하여,
	for (int i = 0; i < inputStr.length(); i++) {
    	//사칙연산 기호라면 
		if (inputStr[i]== '+' || inputStr[i] == '-' || inputStr[i] == '*' || inputStr[i] == '/')
		{
			inputStrS.push_back(inputStr[i]);
		}
        //알파벳이라면 'A'값을 빼 몇번째 알파벳인지 알수있게 처리
		else {
			inputStrS.push_back((int)(inputStr[i]-'A'));
		}
			
	}

이런식으로 char형 vector에 넣어주었다.
char형에는 -127부터 127까지의 integer값이 들어갈 수 있으므로,
char형 벡터에 int형으로 몇번째 알파벳인지를 넣어준 후,

		//값이 숫자라면 스택에 푸시
		else {
			ans.push(inputArr[inputStrS[i]]);
		}

이런 식으로 char형에 저장된 int형 변수를 index값으로 사용하였다.

코드

#include<iostream>
#include<stack>
#include<vector>

using namespace std;
int N;
string inputStr;
int inputArr[27];
vector<char> inputStrS;
stack<double> ans;

void input() {
	cin >> N>>inputStr;
	for (int i = 0; i < N; i++) {
		cin >> inputArr[i];
	}
	//inputStr문자열을 char형으로 하나하나 뜯어봄
	for (int i = 0; i < inputStr.length(); i++) {
		//사칙연산 기호가 있다면
		if (inputStr[i]== '+' || inputStr[i] == '-' || inputStr[i] == '*' || inputStr[i] == '/')
		{
			inputStrS.push_back(inputStr[i]);
		}
		//알파벳이라면 'A'값을 빼준후 int형으로 형변환하여 넣어줌.
		else {
			inputStrS.push_back((int)(inputStr[i]-'A'));
		}
			
	}
}

void solution() {
	double tmp1 = 0, tmp2 = 0;
	for (int i = 0; i < inputStrS.size(); i++) {

		//연산기호라면 마지막 두 숫자 빼서 연산 후 결과 값 다시 넣음
		if (inputStrS[i] == '+')
		{
			tmp1 = ans.top();
			ans.pop();
			tmp2 = ans.top();
			ans.pop();
			ans.push(tmp2 + tmp1);
		}
		else if (inputStrS[i] == '-')
		{
			tmp1 = ans.top();
			ans.pop();
			tmp2 = ans.top();
			ans.pop();
			ans.push(tmp2 - tmp1);
		}
		else if (inputStrS[i] == '/')
		{
			tmp1 = ans.top();
			ans.pop();
			tmp2 = ans.top();
			ans.pop();
			ans.push(tmp2/tmp1);
		}
		else if (inputStrS[i] == '*')
		{
			tmp1 = ans.top();
			ans.pop();
			tmp2 = ans.top();
			ans.pop();
			ans.push(tmp1*tmp2);
		}

		//값이 숫자라면 스택에 푸시
		else {
			ans.push(inputArr[inputStrS[i]]);
		}

	}
	//소수점 몇번째 자리인지 고정시킨 후
	cout<<fixed;
	//소수점 밑 둘째자리까지 표시
	cout.precision(2);
	//반복문 빠져나왔다면 결과값만 남아있을 것이므로 
	cout << ans.top();
}

int main() {
	input();
	solution();
}

문풀후생

소수점 몇째 자리까지 고정시키는 방법이 안 떠올라서 검색을 좀 했던 문제다.
정리해놔야겠다.

profile
코딩 창고!
post-custom-banner

0개의 댓글