[백준 2257] https://www.acmicpc.net/problem/2257
C++의 stack STL을 이용하여 stack을 통해 입력값들의 화학식량을 계산
#include <iostream>
#include <string>
#include <stack>
using namespace std;
namespace VALUE{
enum{
H=1, C=12, O=16
};
} // 화학식량 이름공간 선언
int main(void){
string ChemVal;
cin>>ChemVal;
int answer=0;
stack<int> S; // stack 생성
for(char c: ChemVal){ // chemVal에서 c에 대응하는 원소를 찾기
if(c=='('){
S.push(-1); // '('를 -1로 선언
}else if(c==')'){
int num=0;
while(S.top()!=-1){
num+=S.top();
S.pop();
} // 스택의 제일 위 원소가 '('이 되기 전까지 num에 더해주고, stack에서 pop함
S.pop();
S.push(num);
}else if(c>='2' && c<='9'){
int val=c-'0'; // char를 int로 바꿔주기 위함
int prev=S.top();
S.pop();
S.push(val*prev); // 원소기호와 그에 대응하는 개수를 곱해주기 위함
}else{
if(c=='H'){
S.push(VALUE::H);
}else if(c=='C'){
S.push(VALUE::C);
}else if(c=='O'){
S.push(VALUE::O);
}
} // 원소기호에 대응하는 값을 stack에 push함
}
while(!S.empty()){
answer+=S.top();
S.pop();
} // stack이 비어있지 않다면, 스택의 요소를 answer에 더해주고, pop함
cout<<answer<<endl;
return 0;
}
요즘 C++을 배우고 있어서 배운 내용을 써먹어 보고자 수소, 탄소, 산소에 대응하는 원소의 화학식량을 저장하는 VALUE namespace를 이용해서 구현을 해보았다.
화학식량을 가져올 때마다 VALUE::C 와 같이 이름 공간도 함께 불러와야 하는 번거로움이 살짝 있지만, C언어에서 구조체를 선언하는 것과 비슷한 결이기 때문에 c=='C' 이런 식으로 선언하는 것 보다는 개인적으론 조금 더 깔끔한 것 같다.
즐겁게 읽었습니다. 유용한 정보 감사합니다.