본문 바로가기
백준

[백준] C++ 2257번 화학식량

by 당코 2023. 2. 4.

문제

https://www.acmicpc.net/problem/2257

 

2257번: 화학식량

첫째 줄에 화학식이 주어진다. 화학식은 H, C, O, (, ), 2, 3, 4, 5, 6, 7, 8, 9만으로 이루어진 문자열이며, 그 길이는 100을 넘지 않는다.

www.acmicpc.net

 

접근 방법

괄호로 무언가를 계산하는 문제의 해결방법 중에 하나는 스택을 이용하는 것이다.

int를 원소로 하는 스택을 선언하여 문제를 접근하였다.

H, C, O일 경우는 1, 12, 16을 push 하였다.

'('가 입력으로 올 때에는 그냥 push를 하면 '('의 아스키코드인 40이 push가 되기 때문에 오류가 생길 수 있어 사용될 일이 없는 값인 -1로 push를 하였다.

')'가 입력으로 올 때는 '('가 나올 때까지 모든 값들을 더하고 그 값을 다시 스택에 push 해주었다.

2 ~ 9까지의 값이 올 경우는 스택의 top에 값을 곱하여 다시 push를 해주었다.

최종적으로 스택에 push 되어있는 모든 값들을 더하여 답을 구하였다.

 

코드

#include <iostream>
#include <string>
#include <stack>
using namespace std;

string str;
int ans, temp;
stack<int> st;

int main() {
	cin >> str;
	for (int i = 0; i < str.size(); i++) {
		if (str[i] == '(') {
			st.push(-1);
		}
		else if (str[i] == 'H') {
			st.push(1);
		}
		else if (str[i] == 'C') {
			st.push(12);
		}
		else if (str[i] == 'O') {
			st.push(16);
		}
		else if (str[i] >= '2' && str[i] <= '9') {
			temp = st.top() * (str[i] - '0');
			st.pop();
			st.push(temp);
		}
		else if (str[i] == ')') {
			int num = 0;
			while (st.top() != -1) {
				num += st.top();
				st.pop();
			}
			st.pop();
			st.push(num);
		}
	}
	while (!st.empty()) {
		ans += st.top();
		st.pop();
	}
	cout << ans << '\n';
}