문제링크 : https://www.acmicpc.net/problem/1935
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
double arr[26];
stack<double>st;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int N; string s;
cin >> N >> s;
for(int i=0; i<N; i++)
{
cin >> arr[i];
}
for(int i=0; i<s.size(); i++)
{
if(s[i] >= 'A' && s[i] <= 'Z') //알파벳에 대응하는 수 푸쉬
{
st.push(arr[s[i]-'A']);
}
else
{
double op1, op2;
op1 = st.top(); st.pop(); //연산할 첫번째 수
op2 = st.top(); st.pop(); //연산할 두번째 수
if(s[i] == '+') //계산순서 주의
{
st.push(op2 + op1);
}
else if(s[i] == '-')
{
st.push(op2 - op1);
}
else if(s[i] == '*')
{
st.push(op2 * op1);
}
else if(s[i] == '/')
{
st.push(op2 / op1);
}
}
}
cout.precision(2);
cout << fixed << st.top();
return 0;
}
알파벳에 대응하는 수로 전환하여 스택에 수만 따로 저장해준다.
이후 각 사칙연산에 따라서 계산을 해주면 된다.
계산을 위해 스택의 맨 앞 수 2개가 필요하므로 미리 따로 저장하고 pop까지 해준다. (op1, op2)
각 사칙연산에 따라서 계산한 수를 다시 스택에 넣어 문자열 s의 길이만큼 반복해준다.
계산할 때 주의해야 할 것이 op1, op2의 계산 순서이다.
처음에 op1, op2 이렇게 순서대로 스택의 top()을 지정해주었으나 실 계산 순서는 op2, op1이기에 이를 주의해야 한다.
계산하고 나서 다시 스택에 푸쉬하기에 최종 계산이 마친 숫자 또한 top()에 있으므로 모든 계산을 마치고 top()을 출력해주면 된다.
처음에 double이 아닌 float로 했다가 여러번 틀렸다.
찾아보니 정밀도가 float보다 double이 높은데 이를 거꾸로 알고 있어서 float를 썼다가 틀린 것이 었다.
(해당 문제 입력 20억 -> 10자리) [float : 6자리 / double : 15자리]
'백준 > 실버' 카테고리의 다른 글
[백준 1535번] 안녕 (C++) (0) | 2023.10.01 |
---|---|
[백준 16967번] 배열 복원하기 (C++) (0) | 2023.09.30 |
[백준 12847번] 꿀 아르바이트 (C++) (0) | 2023.09.22 |
[백준 11052번] 카드 구매하기 (C++) (0) | 2023.09.19 |
[백준 10825번] 국영수 (C++) (0) | 2023.09.16 |