[BOJ] 2257번_화학식량_스택

ChangBeom·2024년 8월 8일

Algorithm

목록 보기
50/97

[문제]

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

화학식량이란 그 화학식에 포함되어 있는 모든 원자들의 질량의 합이다. 이 문제에서는 수소, 탄소, 산소만 다루는데 수소 원자 하나의 질량은 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;
}

0개의 댓글