
화학식량이란 그 화학식에 포함되어 있는 모든 원자들의 질량의 합이다. 이 문제에서는 수소, 탄소, 산소만 다루는데 수소 원자 하나의 질량은 1, 탄소는 12, 산소는 16이다. 화학식이 주어졌을 때, 이 화학식의 화학식량을 계산하는 프로그램을 만드는 문제이다.
종종 화학식에는 괄호가 사용되기도 하는데 괄호로 묶인 원자들은 하나의 새로운 원자와 같은 작용을 한다. 예를 들면 CH(CO2H)(CO2H)(CO2H)분자는 CH(CO2H)3와 같이 나타낼 수 있다.
스택
- 문자열을 입력받아서 계산해야 하므로 to_string과 stoi를 적절하게 사용해야된다.
- str[i]가 원소일 때 -> 해당 원소의 질량을 push한다.
- 괄호 일 때 -> '(' 일 경우에는 그대로 "("를 push해주고, ')'일 경우에는 "("나올 때까지 s.top()을 더하고 그 값을 다시 스택에 push한다. 그리고 마지막으로 "("를 pop해준다.
- 2~9 일 때 -> 스택의 top()에 해당 수를 곱하여 다시 push해준다.
- 마지막에 스택에 존재하는 값을 전부 더하면 답을 구할 수 있다.
//boj2257번_화학식량_자료구조(스택)
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main() {
string str;
cin >> str;
stack<string> s;
for (int i = 0; i < str.size(); i++) {
if (str[i] == 'H') {
s.push("1");
}
else if (str[i] == 'C') {
s.push("12");
}
else if (str[i] == 'O') {
s.push("16");
}
else if (str[i] == '(') {
s.push("(");
}
else if (str[i] == ')') {
int num = 0;
while (s.top() != "(") {
num += stoi(s.top());
s.pop();
}
s.pop();
s.push(to_string(num));
}
else if (str[i] >= '2' && str[i] <= '9') {
int num = stoi(s.top());
s.pop();
s.push(to_string(num * (str[i] - '0')));
}
}
int result = 0;
while (!s.empty()) {
result += stoi(s.top());
s.pop();
}
cout << result;
return 0;
}