1. 문제
https://www.acmicpc.net/problem/1935
1935번: 후위 표기식2
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이
www.acmicpc.net
2. 풀이 과정
1. 후위 표기식을 문자열로 받고, 알파벳에 치환되는 숫자를 인덱스를 [알바펫-65]로 하는 크기 26의 배열에 저장한다.
2. 문자열의 첫번째 문자부터 탐색을 한다.
해당 문자가 피연산자(A ~ Z)면 스택에 Push
해당 문자가 연산자(+, -, / , *)라면 스택에서 피연산자 2개 pop 시킨 후 연산 수행, 결괏값 스택에 Push
💡주의할 점!
스택에서 빼서 연산을 수행할때 +, *는 피연산자의 순서가 상관없지만 /, -는 순서를 신경써주어야한다.
3. 문자열 전체를 돌면서 위 로직 수행
4. Stack의 단 하나 남은 마지막 Top이 결괏값이 된다.
3. C++ 정답 코드
#include <iostream>
#include <string>
#include <stack>
#include <iomanip>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL);
stack <double> s;
int n;
cin >> n;
string postfix;
cin >> postfix;
double arr[26] = {0};
for (int i = 0; i < n; i++) //알파벳에 해당하는 값 저장해놓기
cin >> arr[i];
for (int i = 0; i < postfix.length(); i++)
{
if (postfix[i] >= 'A' && postfix[i] <= 'Z') //피연산자라면 해당 값 push
s.push(arr[postfix[i] - 'A']);
else //연산자를 만난다면 스택의 top 2개를 꺼내어 연산 수행후 해당 값 push
{
double op1 = s.top();
s.pop();
double op2 = s.top();
s.pop();
if (postfix[i] == '+')
s.push(op2 + op1);
else if (postfix[i] == '-')
s.push(op2 - op1);
else if (postfix[i] == '*')
s.push(op2 * op1);
else if (postfix[i] == '/')
s.push(op2 / op1);
}
}
cout << fixed << setprecision(2) << s.top(); //소수점 둘째짜리 까지 출력
return 0;
}
'🏆 PS(Problem Solving) > Baekjoon' 카테고리의 다른 글
[C++] 백준 4949 균형잡힌 세상 (0) | 2024.03.13 |
---|---|
[C++] 백준 1427 소트인사이드 (0) | 2024.03.11 |
[C++] 백준 2563 색종이 (0) | 2024.03.09 |
[C++] 백준 18870 좌표 압축 (1) | 2024.03.01 |
[C++] 백준 10989 수 정렬하기 3 (2) | 2024.02.27 |