문제
리뷰
문자열을 입력받아서 char C 배열에 넣는다.
A, B, C ... 에 순서대로 대응하는 숫자값을 벡터 v에 넣는다. 여기까지가 주어진 입력받기다.
문자열 C를 순회하는데,
연산자가 나오면 스택 st에서 숫자 2개를 pop 해서 연산하고, 그 연산 결과를 푸시 한다.
숫자 (A, B, C 같은 알파벳) 이 나오면, 스택 st에 푸시한다.
C B A 순으로 입력 들어오지 않으니까, 문자 'A' 에서 65를 빼면 v 의 인덱스가 나온다.
for(int i = 0; C[i] != NULL; i++){ // 문자열 C 순회
if(C[i] >= 'A' && C[i] <= 'Z'){ // 숫자면, push
// C[i]에서 'A' ASCII 65를 뺀다. v의 인덱스 나옴. -> 앒파벳에 대응하는 num
st.push( v[C[i]-65] );
}else{ // 연산자 만나면, 숫자 2개 pop 해서 연산
double b = st.top(); // 연산 순서에 유의해서 먼저 pop 한 것이 b 다.
st.pop();
double a = st.top();
st.pop();
double ans = 0.0; // a와 b의 연산 결과를 저장할 ans 변수
if(C[i] == '*'){
ans = a*b;
} // 연산자에 대응해서 연산
// ...
st.push(ans); // 연산 결과를 푸시
}
}
답은 계산 결과를 소수점 2째자리 까지 출력하는 것을 유의한다.
코드
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
// 후위표기식2 PostfixNotation2 (지아)
int N;
char C[101];
vector<double> v;
stack<double> st;
int main(void){
cin >> N;
scanf("%s", &C);
while(N--){ // 알파벳 N개 입력받기 (A부터 순서대로 N개 입력받는다)
int num = 0;
cin >> num;
v.push_back(num);
} // 입력받기 끝
// 문자열 C 순회
for(int i = 0; C[i] != NULL; i++){
if(C[i] >= 'A' && C[i] <= 'Z'){ // 숫자면, push
// C[i]에서 'A' ASCII 65를 뺀다. v의 인덱스 나옴. -> 앒파벳에 대응하는 num
st.push( v[C[i]-65] );
}else{
// 연산자 만나면, 숫자 2개 pop 해서 연산
double b = st.top();
st.pop();
double a = st.top();
st.pop();
double ans = 0.0;
if(C[i] == '*'){
ans = a*b;
}else if(C[i] == '/'){
ans = a/b;
}else if(C[i] == '+'){
ans = a+b;
}else if(C[i] == '-'){
ans = a-b;
}
st.push(ans); // 연산 결과를 푸시
}
}
printf("%.2f\n", st.top()); // 소수점 2째 자리까지 출력 유의!
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
나이트의 이동 백준 7562번 (0) | 2020.09.08 |
---|---|
사탕게임 백준 3085번 c++ (0) | 2020.09.07 |
단지 번호 붙이기 백준 2667번 c++ (0) | 2020.09.07 |
미로탐색 백준 2178번 (0) | 2020.09.07 |
토마토 백준 7576번 (0) | 2020.09.06 |